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
  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.1.5.RELEASE</version>
  5. </parent>
  6. <dependencyManagement>
  7. <dependencies>
  8. <dependency>
  9. <groupId>org.springframework.cloud</groupId>
  10. <artifactId>spring-cloud-dependencies</artifactId>
  11. <version>Greenwich.SR1</version>
  12. <type>pom</type>
  13. <scope>import</scope>
  14. </dependency>
  15. </dependencies>
  16. </dependencyManagement>
  17. <dependencies>
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter-web</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.cloud</groupId>
  24. <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-test</artifactId>
  29. <scope>test</scope>
  30. </dependency>
  31. </dependencies>
  32. </project>
  • application.properties

    server.port=8080

    server.port=8088

    USER-SERVICE.ribbon.listOfServers=localhost:8080,localhost:8088
    USER-SERVICE.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule

  • UserController

    @RestController
    @RequestMapping(“manager”)
    public class UserController {

    1. @RequestMapping(value="user/{id}",method = { RequestMethod.GET})
    2. public User queyUserById(@PathVariable(value = "id") Integer id){
    3. System.out.println("-------getUser--------");
    4. return new User("张三", new Date(), true, 12345.00);
    5. }
    6. @RequestMapping(value="user",method = { RequestMethod.POST})
    7. public User saveUser(@RequestBody User user){
    8. System.out.println("-------saveUser--------");
    9. return user;
    10. }
    11. @RequestMapping(value="user",method = { RequestMethod.PUT})
    12. public void update(@RequestBody User user){
    13. System.out.println("-------updateUser--------");
    14. }
    15. @RequestMapping(value="user/{pageNow}/{pageSize}",method = { RequestMethod.GET})
    16. public List<User> queyUserByPage(@PathVariable(value = "pageNow") Integer pageNow,
    17. @PathVariable(value = "pageSize") Integer pageSize){
    18. List<User> list = new ArrayList<>();
    19. list.add(new User("张三", new Date(), false, 11111.00));
    20. list.add(new User("李四", new Date(), true, 20000.00));
    21. System.out.println("-------getUserPage--------");
    22. return list;
    23. }
    24. @RequestMapping(value="user/{ids}",method = { RequestMethod.DELETE})
    25. public void deleteUserById(@PathVariable(value = "ids") Integer[] ids){
    26. System.out.println("-------deleteUsers--------");
    27. }

    }

  • SpringRibbonApplication

    @SpringBootApplication
    public class SpringRibbonApplication {

    1. public static void main(String[] args) {
    2. SpringApplication.run(SpringRibbonApplication.class,args);
    3. }
    4. @Bean
    5. @LoadBalanced
    6. public RestTemplate restTemplate(){
    7. return new RestTemplate();
    8. }

    }

  • User

    public class User implements Serializable {

    1. private Integer id;
    2. private String name;
    3. @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    4. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    5. private Date birthDay;
    6. private Boolean sex;
    7. private Double salary;

    }

  • RestTemplateTests

    @SpringBootTest(classes = SpringRibbonApplication.class)
    @RunWith(SpringRunner.class)
    public class RestTemplateTests {

    1. @Autowired
    2. private RestTemplate restTemplate;
    3. @Test
    4. public void testQueryUserById(){
    5. String url="http://USER-SERVICE/manager/user/1";
    6. User user = restTemplate.getForObject(url, User.class);
    7. System.out.println(user);
    8. }
    9. @Test
    10. public void testQueryUserByPage(){
    11. String url="http://USER-SERVICE/manager/user/1/10";
    12. List<User> users = restTemplate.getForObject(url, List.class);
    13. for (int i = 0; i < users.size(); i++) {
    14. System.out.println(users.get(i));
    15. }
    16. }
    17. @Test
    18. public void testSaveUser(){
    19. String url="http://USER-SERVICE/manager/user";
    20. User user = restTemplate.postForObject(url, new User("李四", new Date(), true, 15000.0), User.class);
    21. System.out.println(user);
    22. }
    23. @Test
    24. public void testUpdateUser(){
    25. String url="http://USER-SERVICE/manager/user";
    26. User user = new User("李四", new Date(), true, 18000.0);
    27. user.setId(3);
    28. restTemplate.put(url,user);
    29. }
    30. @Test
    31. public void testDeleteUser(){
    32. String url="http://USER-SERVICE/manager/user/1,2,3";
    33. restTemplate.delete(url);
    34. }

    }

除此自外,SpringCloud提供了一种基于配置文件的配置方式

  • SpringRibbonApplication

    @SpringBootApplication
    @RibbonClient(name = “USER-SERVICE”,configuration = { UserSerivceRibbonConfigure.class})
    public class SpringRibbonApplication {

    1. public static void main(String[] args) {
    2. SpringApplication.run(SpringRibbonApplication.class,args);
    3. }
    4. @Bean
    5. @LoadBalanced
    6. public RestTemplate restTemplate(){
    7. return new RestTemplate();
    8. }

    }

  • UserSerivceRibbonConfigure

    @Configuration
    public class UserSerivceRibbonConfigure {

    1. @Bean
    2. public ServerList<Server> ribbonServerList(){
    3. Server server1 = new Server("localhost", 8080);
    4. server1.setZone("beijing");
    5. Server server2 = new Server("localhost", 9090);
    6. server2.setZone("shanghai");
    7. return new StaticServerList<Server>(server1,server2);
    8. }
    9. @Bean
    10. public IRule ribbonRule(){
    11. return new RandomRule();
    12. }
    13. @Bean
    14. public ZonePreferenceServerListFilter ribbonServerListFilter(){
    15. ZonePreferenceServerListFilter filter = new ZonePreferenceServerListFilter();
    16. filter.setZone("beijing");
    17. return filter;
    18. }

    }

用户可以直接使用LoadBalancerClient查询服务列表

  1. @Autowired
  2. private LoadBalancerClient loadBalancer;
  3. @Test
  4. public void testChoose(){
  5. for (Integer i=0;i<10;i++){
  6. ServiceInstance instance = loadBalancer.choose("stores");
  7. URI storesUri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort()));
  8. System.out.println(storesUri);
  9. }
  10. }

测试结果
在这里插入图片描述
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,52人围观)

还没有评论,来说两句吧...

相关阅读