Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于 Netflix Ribbon 实现,通过 Spring Cloud 的封装,可以让我们轻松地将面向服务的 REST 模板请求自动转换成客户端负载均衡的服务调用
0. 创建项目(在原来的项目基础上进行创建)
填写 ? 的项目描述信息
根据 ? 的选择对应的可选项
创建成功的项目 ?
1. 项目配置
修改 resources 目录下的 application.properties 为 application.yml 通过 alt + shift + r 快捷键进行修改
然后填写 ? 的内容
server:
port: 8040
spring:
application:
name: ribbon
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
修改 mr.s.ribbon 包下的 SpringRibbonApplication 启动类,具体内容如 ?
package mr.s.ribbon;
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 SpringRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(SpringRibbonApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
2. 代码编写
- 实体类编写 在 mr.s.ribbon 包下创建 entity 包,并创建 Student 实体类
内容 ?
package mr.s.ribbon.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private long id;
private String name;
private int age;
}
- 控制器 handler 编写,在 mr.s.ribbon 下创建 controller 包,并创建 RibbonHandler 控制器类
内容 ?
package mr.s.ribbon.controller;
import mr.s.ribbon.entity.Student;
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;
import java.util.Collection;
@RestController
@RequestMapping("/ribbon")
public class RibbonHandler {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/findAll")
public Collection<Student> findAll(){
return restTemplate.getForObject("http://provider/student/findAll",Collection.class);
}
@GetMapping("/index")
public String index(){
return restTemplate.getForObject("http://provider/student/index",String.class);
}
}
为了更好的看出负载均衡的效果,我们要将之前写的 spring-provider 项目进行改写
在 spring-provider 的 StudentHandler 里面加上
再复制一份 SpringProviderApplication 启动类 重新命名为 SpringProviderApplication2
3. 效果展示
先将 spring-server 注册中心开启, 然后分别修改 spring-provider 的 application.yml 中配置的端口号,一个修改为 8777 一个修改为 8888 ,然后启动者两个服务提供者,最后启动本项目
先访问 http://localhost:8761/ 注册中心
看到 ? 的信息,证明项目启动成功
现在访问 http://localhost:8040/ribbon/findAll ?