Spring Cloud认知学习(三):网关Zuul、config使用

 


💡上一篇介绍一个新的组件Hystrix,Hystrix是一个熔断器,可以用于解决微服务调用中发送的服务熔断和服务降级问题。 Spring Cloud认知学习(四):熔断器Hystrix的使用

💡这一篇介绍一个新的组件Zuul,Zuul是网关组件,对Api请求进行了统一的接收,基于网关,我们可以对所有的请求来进行处理,进行日志记录,请求授权等操作。


zuul

 

  • zuul可以作为微服务的网关,所谓网关,其实就是服务消费者通过网关来访问服务消费者,就好像网络环境中我们都是把请求丢给网关,网关再向外请求的。
  • zuul是Netfilx OSS的一员,可以与其他的Netfilx OSS的兄弟,如Eureka,Ribbon,Hystrix很好的配合。
  • 为了应对zuul的更新问题,spring 团队也自己开发了一个网关组件--Spring Cloud Gateway,但还是像我之前说的,学这个一方面是为了了解多种知识,一方面是为了避免需要接手zuul项目或者把zuul项目改造成gateway的却缺少zuul知识的问题,而且zuul还没凉不是吗

 

作用:

💡使用网关来隐藏了具体的服务的URL,外部调用API接口的时候都是使用网关的URL,避免了服务的敏感信息的泄露。
💡由于所有的请求都经过网关,所以可以在网关做身份认证和权限认证。
💡可以在网关做统一的日志记录。
💡可以在网关做统一的监控处理。
💡可以与eureka、ribbon等结合,可以实现对请求的负载均衡。

 

简单示例:

下面的代码可以参考zuul整合使用实验

0.创建模块

0.创建新模块spring-cloud-zuul-10001

1.导入依赖:

复制代码
    <dependencies>
        <!--引入公共依赖包 start-->
        <dependency>
            <groupId>com.progor.study</groupId>
            <artifactId>spring-cloud-common-data</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--引入公共依赖包 end-->
        <!--导入zuul-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
        <!--导入eureka-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--导入actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--导入hystrix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <!--导入web相关-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

 

2.主程序增加注解:

复制代码
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient // 需要加eureka,因为他也需要拉取服务列表
public class SpringCloudZuul10001Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudZuul10001Application.class, args);
    }

}

 

3.配置application.yml:

复制代码
server:
  port: 10001

spring:
  application:
    name: spring-cloud-zuul

# 为了负载均衡之类的和拉取服务之类的,也需要配置eureka
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka
  instance:
    instance-id: zuul-10001.com
    prefer-ip-address: true

# 配置zuul
zuul:
  routes: # 配置路由
    UserService.serviceId: USERSERIVE # 服务名
    UserService.path: /myuser/**  # 在本地用什么来映射,比如/user/list会映射成本地的/myuser/user/list

 

4.测试

🔴启动spring-cloud-user-service-8001spring-cloud-zuul-10001spring-cloud-eureka-server-7001
🔴访问http://localhost:10001/myuser/user/list,你会发现与调用http://localhost:8001/user/list的效果一致,所以上面的配置成功了,我们通过zuul的10001作为一个网关调用到了8001的服务,那么以后的消费者都可以调用网关的接口来间接调用服务接口。

 

配置语法:

路由

复制代码
zuul:
  routes: # 配置路由
    UserService.serviceId: USERSERIVE # serviceId用来服务名。UserService.前缀是用来分组映射的,可以是自定义的前缀。
    UserService.path: /myuser/**  # 在本地用什么来映射,比如/user/list会映射成本地的/myuser/user/list

也可以是:

复制代码
zuul:
  routes: # 配置路由
    UserService:
      serviceId: USERSERIVE # 服务名
      path: /myuser/**  # 在本地用什么来映射,比如/user/list会映射成本地的/myuser/user/list
    MessageService:
      serviceId: MESSAGESERIVE # 服务名
      path: /mymsg/**  #

💡ignored-services:默认情况下,zuul会对能拉取到的服务都进行映像。在eureka有MessageService,但我们没有配置的时候,你访问http://localhost:10001/messageserive/msg/list也可以访问到MessageService,因为默认会采取http://ip:port/服务名来映射。如果你不需要默认映射,只采用你手动配置的映射,那么需要配置zuul.ignored-services = '*'
💡prefix:用来指定一个全局的前缀,比如说上面的是/mymsg/** ,如果你配置了zuul.prefix=/api,那么你以后需要调用/api/mymsg/**才能访问到MESSAGESERIVE的接口。

复制代码
# 配置zuul
zuul:
  prefix: /api
  routes: # 配置路由
    UserService:
      serviceId: USERSERIVE # 服务名
      path: /myuser/**  # 在本地用什么来映射,比如/user/list会映射成本地的/myuser/user/list
  ignored-services: '*'


Spring Cloud Config

作用:

  • 在分布式部署中,肯定会有很多个服务端需要部署,理论上各种服务端可能需要采用不同的配置文件,所以对于多个服务端的配置文件分发也是个问题。
  • Spring Cloud Config就是作为配置中心存在的,其他服务端可以从它这里拉取服务端所需的配置文件。
  • 原理:Spring Cloud Config对外暴露Http API接口,Spring Cloud Config Client通过调用Config Server的Http接口来获取配置文件。

简单示例

Spring Cloud Config可以从很多地方拉取配置文件,本地远程都可以。由于从远程git拉取比较常见,所以这里举的例子是远程git的。【本地拉取的会在单章中演示。】

下面的代码可以参考:Spring Cloud Config配置中心使用实验

创建配置中心

1.创建模块spring-cloud-config-server-11000,这是作为配置服务中心的模块,就好像我们之前使用eureka的时候也要创建一个eureka-server。


2.给spring-cloud-config-server-11000模块导入依赖:

    <dependencies>
        <!--引入公共依赖包 start-->
        <dependency>
            <groupId>com.progor.study</groupId>
            <artifactId>spring-cloud-common-data</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--引入公共依赖包 end-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
    </dependencies>

3.修改spring-cloud-config-server-11000模块的application.yml:

server:
  port: 11000

spring:
  application:
    name:  spring-cloud-config-server
  cloud: # 配置spring cloud config
    config:
      server:
        git: # 使用git来拉取
          uri: https://github.com/alprogor/spring-cloud-config-test.git #GitHub上面的git仓库名字
          search-paths: messageservice
          # 如果你不指定search-paths,那么默认是在根目录查找的,那么你的config文件需要放在根目录


4.修改主程序类,增加@EnableConfigServer

@SpringBootApplication
@EnableConfigServer
public class SpringCloudConfigServer11000Application {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudConfigServer11000Application.class, args);
    }

}

5.在github上面创建一个仓库,在本地拉取这个仓库,创建一个文件夹messageservice,文件夹里面有一个spring-cloud-message-config-11000.yml,填入下面的代码只会,推送到github:
可以参考代码:spring-cloud-config-test

spring:
  profiles:
    active:
      - dev

---
spring:
  profiles: dev
  application:
      name: spring-cloud-message-service-config-dev

---
spring:
  profiles: test
  application:
    name: spring-cloud-message-service-config-test

server:
  port: 8006

6.启动spring-cloud-config-server-11000
💡访问http://localhost:11000/master/spring-cloud-message-config-11000.yml可以看到主分支上的配置文件。
💡访问http://localhost:11000/master/spring-cloud-message-config-11000-test.yml,可以看到test profile下的配置
💡如何拼接路径来访问配置文件,可以参考下图:
20200513152923


拉取配置

1.创建模块spring-cloud-message-service-config-8006
2.导入依赖:

<dependencies>
        <!--引入公共依赖包 start-->
        <dependency>
            <groupId>com.progor.study</groupId>
            <artifactId>spring-cloud-common-data</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--引入公共依赖包 end-->
        <!--引入web开发相关包 start-->
        <!--web 模块-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--jettey作为默认的服务器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
        </dependency>
        <!--引入web开发相关包 end-->

        <!--spring -cloud -config 场景包 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

    </dependencies>

3.在模块spring-cloud-message-service-config-8006的resources下创建bootstrap.yml:
💡bootstrap.yml是一个优先级很高的配置文件,反正优先于application.yml,所以它可以用来拉取配置文件。

spring:
  cloud:
    config:
      name: spring-cloud-message-config-11000 #需要从github上读取的资源名称,注意没有yml后缀名
      profile: test   #本次访问的配置项
      label: master
      uri: http://localhost:11000 
posted @ 2022-02-28 11:01  hanease  阅读(174)  评论(0编辑  收藏  举报