ribbon(feign)负载策略zuul路由规则原理及自定义思路分析---灰度发布用
ribbon(feign)负载策略zuul路由规则自定义思路分析
zull隔离策略
ribbon-isolation-strategy: thread----独立线程,不可共享上下文
ribbon-isolation-strategy: -----可以共享上下文信息
ribbon:
负载均衡策略自定义的覆盖配置
负载均衡的两种配置方法(通过属性的配置方式):
一种直接调用ConfigurationManager获取配置实例,然后设置配置属性;一种是在application.yml中配置。
一般一个lb加载器传入现有服务列表,负载策略即可实现自定义的负载
负载均衡实现的思路:
实现iurle接口
里面定义什么符合什么条件就以负载服务列表为基础选择这个条件对应的机器
feign:
feign其实不是做负载均衡的,负载均衡是ribbon的功能,feign只是集成了ribbon而已,但是负载均衡的功能还是feign内置的ribbon再做,而不是feign。
feign的作用的替代RestTemplate,性能比较低,但是可以使代码可读性很强。
feign的负载策略是ribbon,只要修改ribbon的负载策略即可改变feign负载,feign会自动寻找到容器中的ribbon注入
可以通过java的方式,或者配置文件的方式设定要注入的ribbonrule(可自定义)
feign的隔离策略
# 在feign和Ribbon里面配置隔离策略(全局配置)
#hystrix.command.default.execution.isolation.strategy=SEMAPHORE
# 配置单个 ystrixCommandKey在Ribbon下面默认为方法名,在feign下面默认为类名#方法名(参数类型)
#hystrix.command.HystrixCommandKey.execution.isolation.strategy=SEMAPHORE
这些配置项的前缀是【客户端名称】.ribbon
The supported properties are listed below and should be prefixed by <clientName>.ribbon.:
NFLoadBalancerClassName: should implement ILoadBalancer
NFLoadBalancerRuleClassName: should implement IRule
NFLoadBalancerPingClassName: should implement IPing
NIWSServerListClassName: should implement ServerList
NIWSServerListFilterClassName should implement ServerListFilter
其中比较重要的是NFLoadBalancerRuleClassName,我们可以通过这个配置项定制需要的负载均衡规则,可以是ribbon提供的原生的几种规则类,也可以是自己实现的规则类,这些类都实现了IRule接口。
NFLoadBalancerPingClassName用于配置查看服务器是否存活。
NFLoadBalancerRuleClassName指定负载均衡器的实现类。当然,可以设置自己实现的负载均衡器。
NIWSServerListClassName是服务器列表的处理类,用来维护服务器列表的。Ribbon已经实现了动态服务器列表。
NIWSServerListFilterClassName是服务器的拦截类。
zuul负载策略--
自定义路由:
1,网关可以跳转到zuul
ZuulController 对/根路劲过滤 经过一系列过滤器
2,zuul获取所有过滤器和自定义路由
过滤器部分--自定义过滤器纳入spring:
@Component =@Configuration + @Bean 将过滤器纳入spring
ZuulFilterConfiguration 获取所有的纳入spring过滤器
ZuulFilterInitializer 获取所有的过滤器保存在filterRegistry中
自定义路由部分:
ZuulProxyAutoConfiguration 按照实现类的接口自动注入该自定义的路由规则
PreDecorationFilter
@Configuration +@Bean(value = "discoveryRouteLocator") =里面就是自定义的路由规则
CustomRouteLocator:
@Configuration
publicclass AppConfig{ //.....省略....@Bean(value = "discoveryRouteLocator") public DiscoveryClientRouteLocator discoveryClientRouteLocator(ServerProperties server, DiscoveryClient discovery, ZuulProperties properties,ServiceInstance localInstance) { returnnew CustomRouteLocator(server.getServletPath(), discovery,properties,localInstance); } }3,zuul过滤器执行过程:
zuulfiter的过滤器类型是在过滤器中设置的
type: pre,routing,post
过滤器的获取方式是通过类型查找---享元模式
获取到过滤器之后循环遍历,传入过滤器一个一个执行
pre类型的PreDecorationFilter过滤器,用来进行路由规则的匹配,
根据请求的url选择路由,选择之后:
/xxx/service_name是通过RibbonRoutingFilter实现对服务的负载均衡访问
http://www.abc.com/xxx/service_name这种,则是通过SendForwardFilter过滤器实现转发访问
参考:
https://www.cnblogs.com/cxxjohnson/p/9027919.html
https://blog.csdn.net/chuxue1989/article/details/80787730
https://www.cnblogs.com/liangzs/p/8946740.html