3 Zuul和Ribbon和Config


Zuul服务网关

  • 新建module,添加web依赖

  • 修改标签

  • 添加依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zuul</artifactId>
    </dependency>
    
  • 添加配置

    # 端口号
    server:
      port: 8092
    
    # 服务名(应用名),会在eureka注册中心显示
    spring:
      application:
        name: zuul-server
    
    # eureka
    eureka:
      client:
        service-url:
          defaultZone: http://127.0.0.1:8089/eureka
    
    # 配置服务网关
    zuul:
      routes:
        edoc-cosumer: # 路由的服务名
          path: /edoc-zuul/** # 网关映射的路径
          serviceId: edoc-cosumer #指定的是真实的服务名(eureka注册的服务名)
          # url: http://127.0.0.1:8091 # 时间路由访问的url,不利于维护和实现均衡负载
    
  • 添加启动类注解

    @EnableEurekaClient
    @EnableZuulProxy
    

添加自定义网关过滤器

@Component
public class MyZuulFilter extends ZuulFilter {
    @Override
    public String filterType() {
        // 设置过滤器的类型,只有四个值:pre,post,route,error
        // pre:在请求被路由转发之前调用
        // post: 在请求被路由转发之后调用
        // route: 在请求被路由转发时调用
        // error: 在服务网关发送异常的时候调用调用
        return "pre";
    }
    @Override
    public int filterOrder() {
        // 设置过滤的顺序,int类型值,越小优先级越高(越早执行)
        return 0;
    }
    @Override
    public boolean shouldFilter() {
        //设是否执行具体的过滤业务逻辑,如果返回的是true,代表执行下面的run方法;如果是false,代表下方的run方法不执行
        return true;
    }
    @Override
    public Object run() {
        // 执行真实的业务处理逻辑
        // 模拟拦截请求,校验是否携带token,实现鉴权
        // 获取一个上下文对象
        RequestContext context = RequestContext.getCurrentContext();

        // 获取request请求
        HttpServletRequest request = context.getRequest();

        // 一般都是从请求头中获取参数
        // String token = request.getHeader("token");

        // 方便模拟,从请求参数中获取
        String token = request.getParameter("token");

        //有效性校验,token有效,放行;无效,提示
        if (StringUtils.isEmpty(token)) {
            // 不能继续执行,告诉忘光不调用后续服务接口,直接响应客户端(返回一自定义错误)
            context.setSendZuulResponse(false);

            // 提示信息
            context.setResponseBody("Sorry,token is null or error");

            // 执行相应的状态码
            context.setResponseStatusCode(4001);
        }
        return null;
    }
}

Ribbon:负载均衡

consumer依赖了feign,点击pom依赖,然后可以看到,fegin已经依赖了hystrix熔断机制

测试默认负载均衡策略

  1. 重新提供一个xxx-provider,注意服务名要一致,接口返回不同

  2. 启动两个provider,通过consumer服务进行测试

  3. 默认的负载均衡策略是:轮询

  4. 修改负载均衡策略,在consumer消费端增加配置

    • feign默认加载了ribbon负载均衡,默认负载均衡机制是:轮询

    • 负载均衡机制是添加在消费端的,如果改为随机,指定服务名,指定规则

    edoc-provider:
      ribbon:
        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    

Config:配置中心

Spring Cloud Config项目是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用。

使用本地

  • 通过Git/SVN方式做一个配置中心,然后每个服务从其中获取自身配置所需的参数在 application.properties 或 application.yml 文件添加 spring.profiles.active=native 配置,会从项目的 resources路径下读取配置文件

使用远程

  • 通过Git/SVN方式做一个配置中心,然后每个服务从其中获取自身配置所需的参数
  • 在 application.properties 或 application.yml 文件添加 spring.profiles.active=native 配置,会从项目的 resources路径下读取配置文件

Config-Server的搭建

  • 新建module,添加web依赖
  • 修改标签

依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
 	<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-server</artifactId>
    </dependency>
</dependencies>

核心启动类

@EnableConfigServer // 开启配置中心服务端功能
@EnableEurekaClient // 注册到eureka注册中心

核心配置

# 端口号
server:
  port: 80xx

# 服务名
spring:
  application:
    name: config-server
# 服务名(应用名),会在eureka注册中心显示
spring:
  application:
    name: config-server
  # 读取本地配置文件
	# profiles:
	# active: native
# 云配置
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/zuker123/scd-config.git
          search-paths: /scd-config
          username: zuker123
          password: zhukangmY@123

# eureka注册中心
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:80xx/eureka

Config-client的搭建

  • 新建module,添加web依赖
  • 修改标签

依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-client</artifactId>
</dependency>

核心启动类

@EnableEurekaClient

核心配置

# 端口号
server:
  port: 8094

# 服务名(应用名),会在eureka注册中心显示
spring:
  application:
    name: config-client

创建一个bootstrap.properties文件

# springCCloud连接配置中心的配置信息,必须添加到此文件中,配置中心的配置才可以被正确加载
# bootstrap.properties配置文件的优先级高于application.properties,默认的配置信息不会被覆盖
# 什么时候用:
# 1、使用SpringCloud配置中心时,将连接配置中心的属性配置在此文件中
# 2、如果有配置信息是固定不能被覆盖的,也可以添加到此文件中

# 注意:实际上客户端读取的不是远程的配置文件,而是将其clone到本地的配置文件,
# 单独修改远程仓库配置,不能实时生效,必须重启config-server


# 指定读取的配置文件名称-配置中心类路径下的配置文件(本地)
#spring.cloud.config.name=config-native
# 指定读取远程配置文件的名称(配置文件分隔符–前面的内容)
spring.cloud.config.name=config
# 指定读取远程配置文件的环境(配置文件分隔符–后面的内容),默认是default
spring.cloud.config.profile=prod
#指定读取远程配置文件的分支,默认是master
spring.cloud.config.label=master
# 根据服务名自动查找服务(主动发现配置中心),默认是关闭的
spring.cloud.config.discovery.enabled=true
# 指定config配置中心的服务名
spring.cloud.config.discovery.service-id=config-server
# eureka
eureka.client.service-url.defaultZone=http://127.0.0.1:8089/eureka
scd.cs.cfg=lalalallal

构建Git远程配置仓库

  • 创建码云Gitee远程仓库scd-config
  • 本地创建目录,远程仓库clone到本地 git clone https://gitee.com/zuker123/scd-config.git
  • 本地克隆项目中,新建空文件夹scd-config,然后创建四个配置文件
    • config-default.properties -- scd.cs.cfg=scd cfg default
    • config-dev.properties -- scd.cs.cfg=scd cfg dev
    • config-test.properties -- scd.cs.cfg=scd cfg test
    • config-prod.properties -- scd.cs.cfg=scd cfg prod
  • 将本地文件同步到Gitee仓库中
    • git add .
    • git commit -m '增加config配置文件'
    • git push origin master
  • config-server配置文件中,增加git仓库配置,注释掉本地配置
  • 启动config-server配置中心

以上测试都在XMind中

Q.E.D.