在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于 Http Restful
的。Spring Cloud 有两种服务调用方式,一种是 Ribbon
+ RestTemplate
,另一种是 Feign
Ribbon
是一个负载均衡客户端,可以很好的控制 HTTP 和 TCP 的一些行为。
在 pom.xml
中主要添加 spring-cloud-starter-netflix-eureka-server
和 spring-cloud-starter-netflix-ribbon
依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>复制代码
在 application.yml
中添加以下配置
spring: application: name: hello-spring-cloud-web-admin-ribbon thymeleaf: cache: false mode: LEGACYHTML5 encoding: UTF-8 servlet: content-type: text/html server: port: 8764 eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/复制代码
在 Application
入口类中通过添加 @EnableDiscoveryClient
注解开启发现服务功能
@SpringBootApplication @EnableDiscoveryClient public class WebAdminRibbonApplication { public static void main(String[] args) { SpringApplication.run(WebAdminRibbonApplication.class, args); } }复制代码
创建 RestTemplateConfiguration
配置类,该类用于注入 RestTemplate
,并通过 @LoadBalanced
注解表明开启负载均衡功能
@Configuration public class RestTemplateConfiguration { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }复制代码
在这里我们直接用的程序名替代了具体的 URL 地址,在 Ribbon
中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的 URL 替换掉服务名,代码如下:
@Service public class AdminService { @Autowired private RestTemplate restTemplate; public String sayHi(String message) { return restTemplate.getForObject("http://hello-spring-cloud-service-admin/hi?message=" + message, String.class); } }复制代码
创建 Controller 对外提供调用的服务
@RestController public class AdminController { @Autowired private AdminService adminService; @RequestMapping(value = "hi", method = RequestMethod.GET) public String sayHi(@RequestParam String message) { return adminService.sayHi(message); } }复制代码