Ribbon是客户端的负载均衡器,消费者能够通过服务别名调用服务时,须要Ribbon做负载平衡来以某种机制拜访理论的服务调用地址。
简略类比,咱们去找Tony老师,个别理发店都会有多个Tony老师。然而也会有一个相似前台的工作人员为咱们安顿有空的Tony老师理发。工作人员就是相似Ribbon,是依照程序安顿呢,还是随机安顿呢。
Ribbon + Eureka
创立我的项目
同样创立一个Ribbon的空模块,而后在Ribbon空模块下创立一个ribbon-consume9101
子模块。在父类也就是空模块的pom文件中退出依赖
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency></dependencies>
当你引入了Eureka相干的依赖的时候其实就曾经把Ribbon的依赖引入进来了,所以如果应用的是Ribbon + Eureka,能够不必写下面的依赖也能运行。
创立实现后整体的我的项目构造如图所示
配置文件
application.yml
server: port: 9101spring: application: name: ribbon-consumeeureka: client: fetch-registry: true register-with-eureka: true service-url: defaultZone: http://localhost:8001/eureka/ instance: instance-id: ribbon-consume9101
启动和业务类
留神咱们的服务的提供者是eureka-provide
服务,这个服务名字可能单取provide
更精确点,当前我的项目重构的时候可能会批改。
波及到服务与服务之间的调用,个别会抉择应用RestTemplate
,同时须要把它注入Spring容器中,所以抉择应用配置类
@Configurationpublic class ApplicationContextConfig { @Bean @LoadBalanced //负载平衡须要的注解 public RestTemplate getRestTemplate() { return new RestTemplate(); }}
接下来就是主启动类
@SpringBootApplication@EnableEurekaClient@RestControllerpublic class RibbonConsume9101 { final String PROVIDE_URL = "http://eureka-provide"; RestTemplate restTemplate; public RibbonConsume9101(RestTemplate restTemplate) { this.restTemplate = restTemplate; } @GetMapping("/ribbon/consume") public String getInfo() { return "i am consumer, but actually invoke other service: [" + restTemplate.getForObject(PROVIDE_URL + "/eureka/provide", String.class) + "]"; } public static void main(String[] args) { SpringApplication.run(RibbonConsume9101.class, args); }}
测试
- 开启Eureak注册核心
EurekaServer8001
- 开启3个不同端口的服务提供者
EurekaProvide7001
,EurekaProvide7002
,EurekaProvide7003
- 开启刚刚建设的Ribbon消费者
RibbonConsume9101
首先看下Eureka注册核心,能够看到3个服务提供者,1个消费者都曾经注册到Eureka。
接着生产端拜访接口轮询,也是默认规定)。>http://localhost:9101/ribbon/...
自定义配置类
上述调用服务的时候显著是轮询的形式,那如果想要其它形式去调用呢,这时候就须要自定义配置类。
Ribbon次要有6个组件
ServerList:
定义获取服务器列表ServerListFilter:
对ServerList列表进行二次过滤ServerListUpdater:
定义服务更新策略Iping:
查看服务列表是否存活IRlue:
依据算法抉择调用服务列表中的某一个服务ILoadBalancer:
软件负载均衡器入口,整合以上所有的组件实现负载性能
@Configurationpublic class RibbonCustomConfig { @Bean public IRule ribbonRule() { return new RandomRule(); }}
IRlue
接口就是以什么样的规定去调用服务提供者,能够看下该接口的实现类
怎么让这个配置文件被Ribbon感知到呢,就须要利用@RibbonClient
注解。建设一个空的注解类,加上注解和配置类就可能自定义Ribbon配置。
@Configuration@RibbonClient(name = "eureka-provide", configuration = RibbonCustomConfig.class)public class RibbonConfig {}
这里的名字就是咱们须要调用的服务端的配置文件中的springcloud.application.name
的值。须要留神的是,在官网文档外面有这样一段话
在这个例子中翻译过去就是RibbonCustomConfig
如果和主启动类在同一个包下,就会被扫描进Spring中,这样会导致配置文件会被所有的@RibbonClients
所共享。当然也能够用@ComponentScan
把配置文件排除在外。
重启RibbonConsume9101
服务,其它的不必动,同样调用生产端拜访接口http://localhost:9101/ribbon/...
点的时候,啥,怎么始终调用的是7001端口,难道其它服务挂掉了,能够看到前面显著放慢了点的速度,最初还好没有翻车,的确是改成了随机规定。
自定义配置文件
除了通过配置类来自定义Ribbon外,还能够通过配置文件来自定义
这里clientName
同样是须要调用的服务端的配置文件中的springcloud.application.name
的值。 如果是齐全本人写的类呢,须要实现对应的接口,这里同样采纳Netflix写好的RandomRule
类。
把RibbonCustomConfig
和RibbonConfig
删掉或者全副正文掉都能够,批改配置文件
server: port: 9101spring: application: name: ribbon-consumeeureka: client: fetch-registry: true register-with-eureka: true service-url: defaultZone: http://localhost:8001/eureka/ instance: instance-id: ribbon-consume9101#其实就是加了上面的内容eureka-provide: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
其中eureka-provide
就是clientName。接着一样重启RibbonConsume9101
服务,其它的不必动,同样调用生产端拜访接口http://localhost:9101/ribbon/...
值得注意的是,在配置文件中配置的变量是要比配置类中的优先级要高的。
Ribbon
下面是消费者端和服务端都注册进了Eureka,相当于消费者通过Eureka去找到了其它服务提供者的服务。那在真正业务中承受了新的消费者端,并没有注册进Eureka,怎么解决这个问题呢?
先来看看没有注册进去会产生什么状况,想都不必想必定是间接报错了
创立我的项目
同样在Ribbon父模块上面建设一个子模块
配置文件
因为不必注册进Eureka,所以配置文件也要做相应的批改
server: port: 9102spring: application: name: ribbon-consume-without-eureka#禁用掉Eureka,其实禁用不禁用都不影响,因为基本就没导入ribbon: eureka: enabled: false
启动和业务类
同样须要导入RestTemplate
所以能够间接复制上一个子模块
@Configurationpublic class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); }}
主启动类也能够间接复制,不须要用到Eureka,去掉@EnableEurekaClient
注解并批改类名即可
@SpringBootApplication@RestControllerpublic class RibbonConsumeWithoutEureka9102 { final String PROVIDE_URL = "http://eureka-provide"; RestTemplate restTemplate; public RibbonConsumeWithoutEureka9102(RestTemplate restTemplate) { this.restTemplate = restTemplate; } @GetMapping("/ribbon/consume") public String getInfo() { return "i am consumer, but actually invoke other service: [" + restTemplate.getForObject(PROVIDE_URL + "/eureka/provide", String.class) + "]"; } public static void main(String[] args) { SpringApplication.run(RibbonConsumeWithoutEureka9102.class, args); }}
那怎么消费者调用的时候怎么晓得去哪找提供者的服务呢,就须要动配置文件了
server: port: 9102spring: application: name: ribbon-consume-without-eurekaribbon: eureka: enabled: false#以下为减少内容eureka-provide: ribbon: listOfServers: localhost:7001, localhost:7002, localhost:7003
其中eureka-provide
就是须要调用的服务端的配置文件中的springcloud.application.name
的值
开启RibbonConsume9102
服务,其它的不必动,调用生产端拜访接口http://localhost:9102/ribbon/... ,能够看到也是可能依照默认轮询的形式调用服务。
创作不易,如果对你有帮忙,欢送点赞,珍藏和分享啦!
上面是集体公众号,有趣味的能够关注一下,说不定就是你的宝藏公众号哦,根本2,3天1更技术文章!!!