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熔断机制
测试默认负载均衡策略
-
重新提供一个xxx-provider,注意服务名要一致,接口返回不同
-
启动两个provider,通过consumer服务进行测试
-
默认的负载均衡策略是:轮询
-
修改负载均衡策略,在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.