SpringCloud之负载均衡Ribbon(章节2)

版权声明:未经作者允许,不允许用于任何商业用途 https://blog.csdn.net/weixin_38231448/article/details/91039864

作者:jiangzz 电话:15652034180 微信:jiangzz_wx 微信公众账号:jiangzz_wy

负载均衡:Spring Cloud Ribbon

Spring Cloud Ribbon 是一个基于Http和TCP的客服端负载均衡工具,它是基于Netflix Ribbon实现的。通过SpringCloud的自动配置使得项目可以自动的给RestTemplate添加拦截器,实现类似于上一节负载均衡的作用。

快速入门

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.jiangzz</groupId>
  <artifactId>cloud02</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.8</java.version>
  </properties>


  <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
USER-SERVICE.ribbon.listOfServers=localhost:8080,localhost:9090
USER-SERVICE.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
  • 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:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm: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);
  }
}

更多精彩内容关注

微信公众账号

猜你喜欢

转载自blog.csdn.net/weixin_38231448/article/details/91039864
今日推荐