SpringCloud之Ribbon-负载均衡
负载均衡:Spring Cloud Ribbon
Spring Cloud Ribbon 是一个基于Http和TCP的客服端负载均衡工具,它是基于Netflix Ribbon实现的。通过SpringCloud的自动配置使得项目可以自动的给RestTemplate添加拦截器,实现负载均衡的作用。
快速入门
pom.xml
<?xml version=”1.0” encoding=”UTF-8”?>
4.0.0 com.mask
cloud 1.0-SNAPSHOT
UTF-8
1.8
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
application.properties
server.port=8080
server.port=8088
USER-SERVICE.ribbon.listOfServers=localhost:8080,localhost:8088
USER-SERVICE.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRuleUserController
@RestController
@RequestMapping(“manager”)
public class UserController {@RequestMapping(value="user/{id}",method = { RequestMethod.GET})
public User queyUserById(@PathVariable(value = "id") Integer id){
System.out.println("-------getUser--------");
return new User("张三", new Date(), true, 12345.00);
}
@RequestMapping(value="user",method = { RequestMethod.POST})
public User saveUser(@RequestBody User user){
System.out.println("-------saveUser--------");
return user;
}
@RequestMapping(value="user",method = { RequestMethod.PUT})
public void update(@RequestBody User user){
System.out.println("-------updateUser--------");
}
@RequestMapping(value="user/{pageNow}/{pageSize}",method = { RequestMethod.GET})
public List<User> queyUserByPage(@PathVariable(value = "pageNow") Integer pageNow,
@PathVariable(value = "pageSize") Integer pageSize){
List<User> list = new ArrayList<>();
list.add(new User("张三", new Date(), false, 11111.00));
list.add(new User("李四", new Date(), true, 20000.00));
System.out.println("-------getUserPage--------");
return list;
}
@RequestMapping(value="user/{ids}",method = { RequestMethod.DELETE})
public void deleteUserById(@PathVariable(value = "ids") Integer[] ids){
System.out.println("-------deleteUsers--------");
}
}
SpringRibbonApplication
@SpringBootApplication
public class SpringRibbonApplication {public static void main(String[] args) {
SpringApplication.run(SpringRibbonApplication.class,args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
User
public class User implements Serializable {
private Integer id;
private String name;
@DateTimeFormat(pattern = "yyyy-MM-dd HH
ss")
@JsonFormat(pattern = "yyyy-MM-dd HH
ss")
private Date birthDay;
private Boolean sex;
private Double salary;
}
RestTemplateTests
@SpringBootTest(classes = SpringRibbonApplication.class)
@RunWith(SpringRunner.class)
public class RestTemplateTests {@Autowired
private RestTemplate restTemplate;
@Test
public void testQueryUserById(){
String url="http://USER-SERVICE/manager/user/1";
User user = restTemplate.getForObject(url, User.class);
System.out.println(user);
}
@Test
public void testQueryUserByPage(){
String url="http://USER-SERVICE/manager/user/1/10";
List<User> users = restTemplate.getForObject(url, List.class);
for (int i = 0; i < users.size(); i++) {
System.out.println(users.get(i));
}
}
@Test
public void testSaveUser(){
String url="http://USER-SERVICE/manager/user";
User user = restTemplate.postForObject(url, new User("李四", new Date(), true, 15000.0), User.class);
System.out.println(user);
}
@Test
public void testUpdateUser(){
String url="http://USER-SERVICE/manager/user";
User user = new User("李四", new Date(), true, 18000.0);
user.setId(3);
restTemplate.put(url,user);
}
@Test
public void testDeleteUser(){
String url="http://USER-SERVICE/manager/user/1,2,3";
restTemplate.delete(url);
}
}
除此自外,SpringCloud提供了一种基于配置文件的配置方式
SpringRibbonApplication
@SpringBootApplication
@RibbonClient(name = “USER-SERVICE”,configuration = { UserSerivceRibbonConfigure.class})
public class SpringRibbonApplication {public static void main(String[] args) {
SpringApplication.run(SpringRibbonApplication.class,args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
UserSerivceRibbonConfigure
@Configuration
public class UserSerivceRibbonConfigure {@Bean
public ServerList<Server> ribbonServerList(){
Server server1 = new Server("localhost", 8080);
server1.setZone("beijing");
Server server2 = new Server("localhost", 9090);
server2.setZone("shanghai");
return new StaticServerList<Server>(server1,server2);
}
@Bean
public IRule ribbonRule(){
return new RandomRule();
}
@Bean
public ZonePreferenceServerListFilter ribbonServerListFilter(){
ZonePreferenceServerListFilter filter = new ZonePreferenceServerListFilter();
filter.setZone("beijing");
return filter;
}
}
用户可以直接使用LoadBalancerClient查询服务列表
@Autowired
private LoadBalancerClient loadBalancer;
@Test
public void testChoose(){
for (Integer i=0;i<10;i++){
ServiceInstance instance = loadBalancer.choose("stores");
URI storesUri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort()));
System.out.println(storesUri);
}
}
测试结果
还没有评论,来说两句吧...