Spring Cloud学习(二):Ribbon客户端负载均衡

发布时间:2019-07-19 14:00:26发布者:Mr.Zhang阅读(277)

1. Ribbon介绍

微服务是将一个完整的服务按照不同的业务拆分成一个个独立的服务,这些服务之间的通信基于Http Restful,在SpringCloud中服务之间的调用中就有通过Ribbon和RestTemplate。

  • Ribbon主要功能是基于客户端的负载均衡。

  • RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。

2.代码实现

    1. 之前文章已经创建了Eueaka-client服务,在该服务中新增一个Controller模拟业务处理

/**
 * @author 吕梁山
 * @date 2019/7/17
 */
@RestController
public class TestController {

    @Value("${server.port}")
    private String port;

    @RequestMapping("test")
    public String test(String userName){
        return "此次服务端口号:" + port + ",接收到的参数:" + userName;
    }
}
    1. 将该服务复制一份,更换端口,然后将两个服务都启动,因为都已经注册到eurake服务端中,所以在eureka服务端可以看到已经注册了两个同样的服务

    2. 新建一个Ribbon服务

      • 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>
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.1.6.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <groupId>com.pikaqiu.springcloud</groupId>
   <artifactId>ribbon</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>ribbon</name>
   <description>Demo project for Spring Boot</description>

   <properties>
      <java.version>1.8</java.version>
      <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
   </properties>

   <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-eureka-client</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>

   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>

</project>
      • application.yml

server:
  port: 5001
spring:
  application:
    name: ribbon
eureka:
  client:
    service-url:
        defaultZone: http://eureka-server1:3001/eureka/,http://eureka-server2:3002/eureka/
  instance:
    instance-id: Ribbon
      • 向程序的ioc注入一个bean: restTemplate,并通过@LoadBalanced注解表明这个restRemplate开启负载均衡的功能。

@SpringBootApplication
@EnableEurekaClient
public class SpringCloudRibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudRibbonApplication.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}
      • 同样添加一个测试的Controller

/**
 * @author 吕梁山
 * @date 2019/7/16
 */
@RestController
public class MyTestController {

    private String service = "http://eureka-client";

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("test")
    public String test(String userName){
        return restTemplate.getForObject(service + "/test?userName=" + userName, String.class);
    }

}

 

  1. 现在eurek中可以看到已经注册了两个client服务一个ribbon服务

    20190718102252012.png

  2. 测试 访问

http://localhost:5001/test?userName=测试

会发现ribbon会去轮询访问两个client服务

此次服务端口号:4001,接收到的参数:测试
此次服务端口号:4002,接收到的参数:测试

3. 更换负载均衡策略

Ribbon默认的策略是轮训,也就是挨个访问每个服务,也可以自己更换策略或者已定义策略,com.netflix.loadbalancer包下有很多种定义好的策略,可以自己选择,同样可以参照写好的策略类自己写一个策略类

eureka-client:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
  • eureka-client 需要进行负载均衡的服务name

  • NFLoadBalancerRuleClassName 策略类路径,如果是自定义就写自己项目里的路径


欢迎留言:http://pikaqiu.vip/article/2367.html
示例代码:https://github.com/Liangshan1994/SpringCloud





本文转自博客园,原文地址:https://www.cnblogs.com/liangshandada/p/11212245.html