前几篇介绍了服务注册中心以及服务提供者,目前需要一个服务消费者。
本篇介绍如何用Ribbon消费注册中心上注册的服务。
Ribbon是一个基于HTTP和TCP客户端的负载均衡器。Feign中也使用Ribbon,下一篇会介绍Feign的使用。
Ribbon可以在通过客户端中配置的ribbonServerList服务端列表去轮询访问以达到均衡负载的作用。
当Ribbon与Eureka联合使用时,ribbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心中获取服务端列表。同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来确定服务端是否已经启动。
下面我们通过实例看看如何使用Ribbon来调用服务,并实现客户端的均衡负载。
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>1.5.9.RELEASEversion>
<relativePath />
parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>Edgware.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-eurekaartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-ribbonartifactId>
dependency>
dependencies>
@EnableDiscoveryClient
@SpringBootApplication
public class SpringCloudConsumerRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConsumerRibbonApplication.class,args) ;
}
}
server:
port: 8002
spring:
application:
name: springcloud-consumer-ribbon
eureka:
client:
service-url:
defaultZone: http://peer1:8080/eureka/
@Configuration
public class BeanConfig {
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
}
@Service("restfulSerivce")
public class RestfulServiceImpl {
@Autowired private RestTemplate restTemplate ;
public String getRestData(String name){
return restTemplate.getForObject("http://springcloud-service-rest/api/rest/message?name="+name,String.class) ;
}
}
@RestController
public class RestfulController {
@Autowired private RestfulServiceImpl restfulService ;
@Value("${server.port}")
String port ;
@Value("${spring.application.name}")
String name ;
@RequestMapping("/home")
public String home(@RequestParam String name){
return "I am info from port("+port+") from application name("+name+") invoke other service." + "\n"
+restfulService.getRestData(name);
}
}
http://peer1:8080/
http://peer2:8090/
http://peer1:8001/
http://peer1:8002/
效果图:
消费者消费服务,访问消费者(springcloud-consumer-ribbon)对外提供的接口
http://localhost:8002/api/rest/home
效果图如下:
springcloud实战之高可用服务注册中心(eureka集群)
springcloud实战之服务注册与发现(eureka实现)
springcloud实战之技术选型:dubbo还是springcloud
netflix-ribbon-starter
springcloud-server-eureka
springcloud-producer-rest
springcloud-consumer-ribbon