我是靠谱客的博主 害羞电话,最近开发中收集的这篇文章主要介绍Springcloud--服务调度OpenFeign、RestTemplate,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、 RestTemplate

RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。

1. 基本使用

发送GET请求

@RestController
public class OrderController {
    public static final String url = "http://CLOUD-SERVICE";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping(value = "consumer/payment/getPayment/{id}")
    public CommentResult<Payment> getPayment(@PathVariable("id") Integer id){
        // 第一个参数是地址,第二个是返回对象的类型
        return restTemplate.getForObject(url+"/payment/getPayment/"+id, CommentResult.class);
    }
}

发送post请求

@RestController
public class OrderController {
    public static final String url = "http://CLOUD-SERVICE";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping(value = "consumer/payment/getPayment/{id}")
    public CommentResult<Payment> getPayment(@PathVariable("id") Integer id){
        // 第一个参数是地址,第二个是返回对象的类型
        return restTemplate.postForObject(url+"/payment/getPayment/",id, CommentResult.class);
    }
}

比较getForObject()和getForEntity()方法

getForObject()包含了将HTTP转成POJO的功能,但是getForObject没有处理response的能力。因为它拿到手的就是成型的pojo。省略了很多response的信息。

getForEntity()方法不同的是返回的是ResponseEntity对象,包含了ResponseEntity、HttpStatus、BodyBuilder结构。

由于Spring Boot >= 1.4 Spring Boot不再自动定义一个RestTemplate,而是定义了一个RestTemplateBuilder允许您更好地控制所RestTemplate创建的对象。所以需要创建一个配置类将RestTemplate进行注册到bean中。

@Configuration
public class applicationContextConfig {
    @Bean
    @LoadBalanced  
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

RestTemplate的自定义负载均衡方式,自带的负载均衡的在IRule接口下

@Configuration
public class MyselfRule {
    @Bean
    public IRule myRule(){
        return new RandomRule();  // 定义为随机,返回什么就是什么规则
    }
}

自定义负载均衡的方式:首先创建一个负载均衡的接口

/**自定义负载均衡接口*/
public interface LoadBalancer {
    ServiceInstance instances(List<ServiceInstance> serviceInstances);
}

然后进行自定义访问

@Component
public class Mylb implements LoadBalancer {
    // 创建一个原子类
    private AtomicInteger atomicInteger = new AtomicInteger(0);

    // 自定义访问规则
    public final int getandincrease(){
        int current, next;
        do {
            current = this.atomicInteger.get();
            next = current >= 2147483647? 0 : current+1;
        }while (!this.atomicInteger.compareAndSet(current, next));
        return next;  // 把第几次访问拿到
    }

    public ServiceInstance instances(List<ServiceInstance> serviceInstances) {
        int  index = getandincrease() % serviceInstances.size();
        return serviceInstances.get(index);
    }
}

在controller层调用时,通过服务名进行负载均衡

@Resource
private LoadBalancer loadBalancer;

@GetMapping(value = "consumer/payment/lb")
public String mylb(){
    List<ServiceInstance> clientInstances = discoveryClient.getInstances("cloud-service");
    ServiceInstance instance = loadBalancer.instances(clientInstances);
    URI uri = instance.getUri();
    return restTemplate.getForObject(uri+"/payment/lb", String.class);
}

二、 OpenFeign

OpenFeign是一个很好的调用解决方案,很好的糅合了eureka和ribbon,用在消费端。

首先导入OpenFeign的jar包

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

然后编写yml文件

server:
  port: 80

eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7001.com:7001/eureka/
spring:
  application:
    name: feign-order

编写openfeign接口

@Component
@FeignClient(value = "CLOUD-SERVICE") // 添加feign的注解  value是微服务的名字
public interface PaymentFeignService {

    @GetMapping(value = "payment/getPayment/{id}") // 会去CLOUD-SERVICE微服务下进行查找路径
    public CommentResult<Payment> getPayment(@PathVariable("id") Integer id);

    @GetMapping(value = "payment/timeout")
    public String timeout();
}

controller调用:

@RestController
public class OrderFeign {
    @Resource
    private PaymentFeignService paymentFeignService;

    @GetMapping(value = "payment/getPayment/{id}")
    public CommentResult<Payment> getPayment(@PathVariable("id") Integer id){
        return paymentFeignService.getPayment(id);
    }

    @GetMapping(value = "payment/timeout")
    public String timeout(){
        return paymentFeignService.timeout();
    }
}

主启动类:

@SpringBootApplication
@EnableFeignClients  // 开启OpenFeign,不需要加上EnableEurekaClient注解
public class Feignmain {
    public static void main(String[] args) {
        SpringApplication.run(Feignmain.class, args);
    }
}

如果调用的服务处理时间过长Openfeign就会报错,openfeign默认超时时间为1秒钟,如何修改超时时间,首先在yml文件添加配置:

# 设置feign客户端超时时间
ribbon:
  ReadTimeout: 5000  # 建立链接所用的时间适用于正常网络状态下
  ConnectTimeout: 5000  # 连接后从服务器读取到可用资源的时间

如何进行日志的增强打印和修改,在yml文件添加如下配置:

logging:
  level:
    # feign以什么级别监控哪个接口
    com.cloud.springcloud.service.PaymentFeignService: debug

并添加配置类进行日志程度的设置:

@Configuration
public class FeignConfig {
    @Bean
    Logger.Level feignloggerlevel(){
        return Logger.Level.FULL;   // logger是feign包下的,这里记录全日志
    }
}

 

最后

以上就是害羞电话为你收集整理的Springcloud--服务调度OpenFeign、RestTemplate的全部内容,希望文章能够帮你解决Springcloud--服务调度OpenFeign、RestTemplate所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部