在微服务架构中,业务都会拆分成一个独立的服务,服务与服务的通讯是基于http restful的。SpringCloud有两种服务调用方式,一种是ribbon+restTemplate,另外一种是feign,在这篇文章中讲解下ribbon+rest。
一、Eureka创建服务消费者(Ribbon)
Ribbon其实就是一个客户端的负载均衡方式组件
Ribbon在工作时分成两步
第一步先选择EurekaServer,它优先选择在同一区域内负载较少的server
第二步再根据用户指定的策略(默认的轮询策略),在从server取到的服务注册列表中选择一个地址
二、实战
1. 使用IDEA的Spring Assistan创建工程,选择Default,单击next
2.填写项目信息,命名工程名称为eureka_consumer_ribbon,单击next
3.选择SpringCloudDisicovery中的Eureka Discovery Client,Web中的SpringWeb,SpringCloudRouting中的Ribbon,单击next,然后finish完成。
4.创建完后的工程的pom.xml文件自带依赖spring-boot-starter-web、spring-cloud-starter-netflix-eureka-client 、spring-cloud-starter-netflix-ribbon如下:
<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>
5.给EurekaConsumerApplication主程序增加restTemplate类,并通过@LoadBalanced进行负载均衡, 添加@EnableDiscoveryClient,用于寻找Eureka
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaConsumerRibbonApplication {
@Bean
@LoadBalanced//负载均衡
RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerRibbonApplication.class, args);
}
}
6.在resources文件夹下创建application.yml文件,内容如下。并删除掉application.properties。在配置文件指定服务的注册中心地址为http://localhost:8761/eureka/,程序名称为eureka-consumer-ribbon,程端口为8791。
server:
port: 8791
enable-self-preservation: false
spring:
application:
name: eureka-consumer-ribbon
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
7. 新建Service文件夹,创建ConsumerService类
@Service
public class ConsumerService {
@Autowired
RestTemplate restTemplate;
@RequestMapping("hello")
public String goHello()
{
return restTemplate.getForEntity("http://EUREKA-PROVIDER/hello",String.class).getBody();
}
}
8. 新建controller文件夹,创建ConsumerController类
@RestController
public class ConsumerController {
@Autowired
ConsumerService consumerService;
@RequestMapping("hello")
public String goHello()
{
return consumerService.goHello();
}
}
9.运行程序,重新刷新http://localhost:8761 ,界面如下,可以看到eureka_consumer-ribbon已经在到注册中心了:
在地址栏里调用消费者端口地址 http://localhost:8791/hello ,显示如下,证明调用提供者的hello成功