spring-cloud調用服務有兩種方式,一種是Ribbon+RestTemplate, 另外一種是Feign。
Ribbon是一個基於HTTP和TCP客戶端的負載均衡器,類似nginx反向代理,可以很好的控制htt和tcp的一些行為。Feign默認集成了ribbon(即不用添加ribbon的jar包也能使用ribbon負載均衡),只要使用@FeignClient時,ribbon就會自動使用。ribbon負載均衡默認使用輪詢策略,即多個服務依次輪回調用。
springcloud調用服務的底層原理:
客戶端、服務端想注冊中心注冊服務,注冊中心登記了服務的ip,端口號和服務名,當有客戶端調用服務時,通過HttpClient技術獲取服務的接口信息。
前提:
客戶端:service-a
server:
port: 8081
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka
spring:
application:
name: service-a
服務端:service-a
server:
port: 8082
eureka:
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka
spring:
application:
name: service-b
一、Ribbon+REST(不常用)
1、在客戶端添加依賴包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency>
2、在客戶端啟動類中注冊RestTemplate,並使用@LoadBalanced開啟負載功能
@EnableEurekaClient
@SpringBootApplication
public class ServiceAApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceAApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
}
3、在客戶端系統中寫一個測試controller
@RestController public class TestController { @Autowired RestTemplate restTemplate; @RequestMapping("/hi") public String hi(@RequestParam String id){ return restTemplate.getForObject("http://service-b/hi?id="+id, String.class); } }
4、在服務端系統中提供一個hi()方法,供客戶端調用
@EnableEurekaClient @RestController @SpringBootApplication public class ServiceBApplication { public static void main(String[] args) { SpringApplication.run(ServiceBApplication.class, args); } @Value("${spring.application.name}") private String name; @Value("${server.port}") private String port; @RequestMapping("/hi") public String hi(@RequestParam String id){ return "hi, " + id + ", " + name + ":" + port; } }
5、重新啟動客戶端和服務端
6、測試,瀏覽器訪問
http://localhost:8081/hi?id=123
返回結果:
hi, 123, service-b:8082
二、feign(常用)
1、在客戶端添加依賴包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency>
2、在客戶端啟動類中使用@EnableFeignClients開啟feiginClient功能
@EnableEurekaClient @EnableFeignClients @SpringBootApplication public class ServiceAApplication { public static void main(String[] args) { SpringApplication.run(ServiceAApplication.class, args); } }
3、新建一個ServiceAFeignClient接口調用service-b的服務
package com.example.servicea; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Component @FeignClient(value = "service-b") //這里的name對應調用服務的spring.applicatoin.name public interface ServiceAFeignClient { @RequestMapping(value = "/hi") String hi(@RequestParam("id") String id); }
4、在客戶端系統中寫一個測試controller
@RestController public class TestController { @Autowired ServiceAFeignClient serviceAFeignClient; @RequestMapping("/hi") public String hi(@RequestParam String id){ return serviceAFeignClient.hi(id); } }
運行后的結果應該是和ribbon的相同。個人感覺使用feign比較舒服,代碼比較簡潔。