目录
一.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();
}