Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。
 
准备工作 把service-hello工程复制一份,把端口改成8763,启动工程能看到有service-hello工程在Eureka Server注册了两个实例
不想复制的也可以通过配置IDEA启动多个实例
去除 Single instance only 勾选,修改项目端口就可以启动新的实例
建立Ribbon消费者 新建一个module子工程,继承父pom文件并引入依赖:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <modelVersion>4.0.0</modelVersion> <parent>     <groupId>pers.hogwarts</groupId>     <artifactId>cloud</artifactId>     <version>1.0-SNAPSHOT</version> </parent> <artifactId>cloud-server-ribbon</artifactId> <version>0.0.1-SNAPSHOT</version> <name>cloud-server-ribbon</name> <description>Demo project for Spring Boot</description> <dependencies>     <dependency>         <groupId>org.springframework.cloud</groupId>         <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>         <version>RELEASE</version>     </dependency> </dependencies> 
 
配置项如下:
1 2 3 4 5 6 7 8 9 10 eureka:   client:     serviceUrl:       defaultZone: http://localhost:8761/eureka/ server:   port: 8764 spring:   application:     name: service-ribbon 
 
向程序的ioc注入一个bean: restTemplate;并通过@LoadBalanced注解表明这个restRemplate开启负载均衡的功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @SpringBootApplication @EnableEurekaClient public class ServerRibbonApplication {     public static void main(String[] args) {         SpringApplication.run(ServerRibbonApplication.class, args);     }     @Bean     @LoadBalanced     public RestTemplate restTemplate() {         return new RestTemplate();     } } 
 
写一个测试类HelloService来消费service-hello中的hello方法,在程序里用服务名来代替具体的URL,ribbon会根据服务名调用URL,然后写一个controller对外暴露接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 @Service public class HelloServiceImpl {     @Autowired     private RestTemplate restTemplate;     @Override     public String hello(String name) {         return restTemplate.getForObject("http://service-hello/hello?name="+name,String.class);     } } @RestController public class HelloController {     @Autowired     private HelloService helloService;     @RequestMapping(value = "/hello")     public String hello(@RequestParam String name){         return helloService.hello(name);     } } 
 
启动工程, 打开浏览器输入 localhost:8764/hello?name=ribbon 多次访问可以看到浏览器交替显示
hello ribbon,i am from port:8762
 
hello ribbon,i am from port:8763
 
这说明ribbon已经做了负载均衡
架构图