SpringCloud-服务调用

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;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值