一.RestTemplate通信
1.第一種調用方式
RestTemplate restTemplate = new RestTemplate();
String data = restTemplate.getForObject("http://localhost:8773/hi?name=ceshi",String.class);
2.第二種調用方式
@Autowired
private LoadBalancerClient loadBalancerClient;
//第二種調用方式
RestTemplate restTemplate = new RestTemplate();
ServiceInstance serviceInstance = loadBalancerClient.choose("provider");
String url = String.format("http://%s:%s",serviceInstance.getHost(),serviceInstance.getPort());
String data = restTemplate.getForObject(url,String.class);
3.第三種調用方式(使用server_id)
RestTemplate restTemplate = new RestTemplate();
String data = restTemplate.getForObject("http://service-provider/hi?name=" + name, String.class);
負載均衡:在啟動類中加入RestTemplate中bean和LoadBalanced注解
@Bean
@LoadBalanced
RestTemplate restTemplate()
{
return new RestTemplate();
}
再通過注解直接使用restTemplate
@Autowired
RestTemplate restTemplate;
配置負載均衡規則。默認是輪詢規則
service-provider.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
以上配置修改為隨機規則。
二.Feign
1.介紹
Feign是一個聲明式的Web服務客戶端,使用Feign可使得Web服務客戶端的寫入更加方便。
它具有可插拔注釋支持,包括Feign注解和JAX-RS注解、Feign還支持可插拔編碼器和解碼器、Spring Cloud增加了對Spring MVC注釋的支持,並HttpMessageConverters在Spring Web中使用了默認使用的相同方式。Spring Cloud集成了Ribbon和Eureka,在使用Feign時提供負載平衡的http客戶端。
2.使用
pom.xml文件加入配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>
在啟動類中加入注解
@EnableFeignClients
@EnableCircuitBreaker
//value=“你用到的服務名稱”
@FeignClient(value = "service-provider",fallbackFactory = FeignFallBackFactory.class)
public interface HelloServiceFeign {
//服務中方法的映射路徑
@RequestMapping("/hi")
String hi(@RequestParam(value = "name") String name);
}
@Resource
HelloServiceFeign helloServiceFeign;
其中FeignFallBackFactory是錯誤回調處理
/**
* 此類表示FallBack執行的時候,打印相應的日志
* 如果需要訪問產生回退觸發器的原因,可以使用@ feignclient中的fallbackFactory屬性。
*
*/
@Component
public class FeignFallBackFactory implements FallbackFactory<HelloServiceFeign> {
private static final Logger LOGGER = LoggerFactory.getLogger(FeignFallBackFactory.class);
@Override
public HelloServiceFeign create(Throwable arg0) {
FeignFallBackFactory.LOGGER.info("fallback; reason was: {}", arg0.getMessage());
return new HelloServiceFeign() {
@Override
public String hi(String name) {
return "提供者服務出錯";
}
};
}
}
在application.properties中開啟斷路器功能
#斷路器
feign.hystrix.enabled=true
當微服務之間調用出錯的時候,會進入feignFallBackFactory進行錯誤處理。
feign的理念類似於android的Retrofit,用接口注解的方式進行http請求。
PS:Feign中進行token傳遞方式一般是在Feign攔截器中進行的,但是,當開啟斷路器的時候,再feign中不能獲取request,是由於hystrix線程切換導致的,所以需要在feign的config配置中指定bean
@Bean
@Scope("prototype")
public Feign.Builder feignBuilder() {
return Feign.builder();
}