概述
一、 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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复