简介
Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。
Ribbon 工作原理
......
案例搭建
示例代码
建立ribbon-provider-consumer子工程,对于Robbin,我们不用再去重新添加jar了,因为在eureka中就已经有了。
服务注册中心
前几节已经演示过,这里就不多讲了,如需要了解请点击进入
服务消费方
application.yml 配置文件
#服务启动端口号 server: port: 9001 #服务名称(服务注册到eureka名称) spring: application: name: consumer #客户端注册进eureka服务列表内 eureka: client: service-url: defaultZone: http://localhost:7001/eureka #该应用为注册中心,不会注册自己,默认true register-with-eureka: true #是否需要从eureka上获取注册信息,默认true fetch-registry: true
服务接口
package net.riking.springcloud.consumer.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController @RequestMapping("/user/consumer") public class UserConsumerController { @Autowired private RestTemplate restTemplate; private static final String REST_URL_PREFIX = "http://PROVIDER"; @GetMapping("/port") public String port() { String result = restTemplate.getForObject(REST_URL_PREFIX+"/user/provider/port", String.class); return "消费服务:"+result ; } }
启动消费方服务
package net.riking.springcloud.consumer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringBootApplication public class AppConsumer { public static void main(String[] args) { SpringApplication.run(AppConsumer.class, args); } @Bean @LoadBalanced //如果提供者服务为集群,当在请求时,拥有客户端负载均衡的能力, RestTemplate restTemplate() { return new RestTemplate(); } }
服务提供方一
application.yml 配置文件
#服务启动端口号 server: port: 8001 #服务名称(服务注册到eureka名称) spring: application: name: provider #客户端注册进eureka服务列表内 eureka: client: service-url: defaultZone: http://localhost:7001/eureka #该应用为注册中心,不会注册自己,默认true register-with-eureka: true #是否需要从eureka上获取注册信息,默认true fetch-registry: true
服务接口
package net.riking.springcloud.provider.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/user/provider") public class UserProviderController { @Autowired private DiscoveryClient client; @Value("${server.port}") private String port; @GetMapping("/port") public String port() { return "调用提供者provider端口号:"+port ; } }
启动提供方服务
package net.riking.springcloud.provider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient ///开启对EurekaClient的支持,即:作为Eureka客户端,高版本可省略 public class AppProvider { public static void main(String[] args) { SpringApplication.run(AppProvider.class, args); } }
服务提供方二
将服务提供者一中application.yml配置文件端口号修改至8002,然后启动服务提供者二
IDEA工具 项目重复启动方式
启动工程后,访问:http://eureka7001:7001/,我们可以看到有两个提供方服务和一个消费方服务注册进eureka中,这时f环境搭建成功,如下图
Ribbon负载均衡验证
访问http://localhost:9001/user/consumer/port ,信息如下:
再次访问http://localhost:9001/user/consumer/port ,信息如下:
源码分析
本来想好了自己写,但是看了这篇文章( 点击进入),然后就放弃,对于这篇文章,我感觉清晰明了,如果想深入Ribbon可以看看。