1、Ribbon
1、基本使用
1、新建项目,添加pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2、初始化RestTemplate
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
3、远程调用即可
public static final String PAYMENT_URL = "http://PROVIDER-PAYMENT-SERVICE";
return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
2、RestTemplate
1、getForObject
restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
2、getForEntity
ResponseEntity<CommonResult> entity = restTemplate.getForEntity(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
log.info("****entity.getStatusCode():" + entity.getStatusCode());
log.info("****entity.getStatusCodeValue():" + entity.getStatusCodeValue());
log.info("****entity.getBody():" + entity.getBody());
log.info("****entity.getHeaders():" + entity.getHeaders());
3、postForObject
restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
4、postForEntity 可以设置header
5、注意使用postXXX,在服务提供者端参数需要添加@RequestBody
3、负载均衡
1、常见负载均衡
RoundRobinRule:轮询
RandomRule:随机
RetryRule:先按照轮询策略获取服务,失败后会在指定时间重试,获取可用服务
WeightedResponseTimeRule:根据轮询的扩展,响应时间快的权重越大,容器被选中
BestAvailableRule:过滤多次出故障、断路器跳闸的服务,选择并发量最小的服务
AvailabilityFilteringRule:过滤故障实例,在选择并发量比较小的实例
ZoneAvoidanceRule:默认规则,复合判断server所在区域的性能和server的可用性选择服务器
2、更换负载均衡的策略
新建一个配置类,添加Bean实例
@Bean
public IRule myRule(){
return new RandomRule();
}
3、该Bean的包不放在Application启动类下,或者使用exclude排除掉当前类
4、主配置类上添加注解
@RibbonClient(configuration = MyRule.class)
4、轮询算法
1、编写自定义轮询算法,新建一个类,加入IOC容器
private AtomicInteger atomicInteger = new AtomicInteger(0);
public final int getAntIncrement(){
int current;
int next;
do {
current = atomicInteger.get();
next = current >= Integer.MAX_VALUE ? 0 : current + 1;
}while(!atomicInteger.compareAndSet(current, next));
System.out.println("****next:" + next);
return next;
}
@Override
public ServiceInstance instances(List<ServiceInstance> serviceInstances) {
int next = getAntIncrement();
next %= serviceInstances.size();
ServiceInstance instance = serviceInstances.get(next);
return instance;
}
2、去掉RestTemplate的@Balanced注解
3、在Controller调用
List<ServiceInstance> instances = discoveryClient.getInstances("PROVIDER-PAYMENT- SERVICE");
ServiceInstance instance = myLB.instances(instances);
URI uri = instance.getUri();
return restTemplate.getForObject(uri + "/payment/get/" + id, CommonResult.class);
2、OpenFeign
1、基本使用
1、新建项目,添加pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、新建Service接口,定义需要远程调用的方法
需要在接口上加注解,@FeignClient(value = "PROVIDER-PAYMENT-SERVICE")、@Component
@GetMapping("/get/{id}")
public CommonResult getPaymentById(@PathVariable("id") Long id);
3、在主启动类上加注解@EnableFeignClients,在Controller注入service调用即可
2、超时设置
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间
ConnectTimeout: 5000
3、日志增强
logging:
level:
# feign日志以什么级别监控哪个接口
com.wx.springcloud.service.PaymentFeignService: debug
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
}