Ribbon
Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP客户端的行为。为Ribbon,配置服务提供者的地址列表后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多的负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。在SpringCloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从EurekaServer获取服务提供者的地址列表,并基于负载均衡算法,请求其中一个服务提供者的实例(为了服务的可靠性,一个微服务可能部署多个实例)。
=================================================
在上次springcloud工程的基础上,引入ribbon
springcloud的创建
首先在原先的基础上再创建一个server-producer_1,把端口号改为8763,其他的和第一个producer一样。
以Spring Initializr方式在管理工程下新建子工程server-ribbon,勾选web、Eureka和Routing下的Ribbon依赖。修改pom文件:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mxc</groupId>
<artifactId>springcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.mxc</groupId>
<artifactId>server-ribbon</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--打包方式-->
<packaging>jar</packaging>
<name>server-ribbon</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.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>
</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>
在管理工程pom文件下加入
<module>server-ribbon</module>
将启动类修改为
package com.mxc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class ServerRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(ServerRibbonApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
}
新建controller包和RibbonController类
package com.mxc.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
public class RibbonController {
@Autowired
RestTemplate restTemplate;
@RequestMapping
public List getProducts(@RequestParam(value = "name",defaultValue = "ribbon")String name){
return restTemplate.getForObject("http://PRODUCER/getProducts?name="+name,List.class);
}
}
修改application.yml文件
server:
port: 8764
spring:
application:
name: producer
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
依次启动子工程,在浏览器上重复访问http://localhost:8764/getProducts?name=mm即可看到
[“香蕉”,“苹果”,“雪梨”,“樱桃”,“mm你好!以上水果由8763提供.”]
[“香蕉”,“苹果”,“雪梨”,“樱桃”,“mm你好!以上水果由8762提供.”]
交替出现。
停止producer_1,再重复访问,这是只会看到
[“香蕉”,“苹果”,“雪梨”,“樱桃”,“mm你好!以上水果由8762提供.”]
出现。