本文的参考资料:
spring cloud ribbon文档
方志明博客
Spring Cloud构建微服务架构(二)服务消费者
Ribbon是一个基于HTTP和TCP客户端的负载均衡器。Feign中也使用Ribbon,因此如果使用@FeignClient
注解就会使用Ribbon。
Ribbon的核心概念是client,每隔负载均衡是组件的一部分,同远程服务器一同工作,并且可以指定名称(例如通过@FeignClient注解)。
Spring Cloud使用
RibbonClientConfiguration为每个命名的客户端根据需要创建一个新的集合作为ApplicationContext。 这包含(其中包括)一个ILoadBalancer
,一个RestClient
和一个ServerListFilter
。
ribbon 已经默认实现了这些配置bean:
- IClientConfig
ribbonClientConfig: DefaultClientConfigImpl
- IRule
ribbonRule: ZoneAvoidanceRule
- IPing
ribbonPing: NoOpPing
- ServerList
ribbonServerList: ConfigurationBasedServerList
- ServerListFilter
ribbonServerListFilter: ZonePreferenceServerListFilter
- ILoadBalancer
ribbonLoadBalancer: ZoneAwareLoadBalancer
当Ribbon与Eureka联合使用时,ribbonServerList
会被DiscoveryEnabledNIWSServerList
重写,扩展成从Eureka注册中心中获取服务端列表。同时它也会用NIWSDiscoveryPing
来取代IPing
,它将职责委托给Eureka来确定服务端是否可用。
此时有eureka-client有两个服务在运行:
构建一个spring boot项目,pom.xml文件如下:
<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.0modelVersion>
<groupId>com.orangegroupId>
<artifactId>ribbonartifactId>
<version>0.0.1version>
<packaging>jarpackaging>
<name>ribbonname>
<description>Demo project for Spring Ribbondescription>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>1.5.7.RELEASEversion>
<relativePath/>
parent>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
<spring-cloud.version>Dalston.SR3spring-cloud.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-eurekaartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-ribbonartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring-cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>
project>
application.yml
文件中配置eureka服务注册中心:
spring:
application:
name: ribbon-consumer
server:
port: 8764
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
在应用主类中,通过@EnableDiscoveryClient
注解来添加发现服务能力。创建RestTemplate实例,并通过@LoadBalanced
注解开启均衡负载能力。
@EnableEurekaClient
@SpringBootApplication
public class RibbonApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(RibbonApplication.class, args);
}
}
创建测试类HelloService和HelloController:
HelloService.java
@Service
public class HelloService {
@Autowired
RestTemplate restTemplate;
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
return restTemplate.getForObject("http://EUREKA-CLIENT/hello", String.class);
}
}
HelloController.java
@RestController
public class HelloController {
@Autowired
private HelloService service;
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
return service.hello();
}
}
启动该应用,访问http://localhost:8764/hello,页面交替出现
This is a Eureka client, from port: 8762
This is a Eureka client, from port: 8763
https://gitee.com/tianqian/Springcloudlearn/tree/master/Chaper2/ribbon