Springcloud--服务调度OpenFeign、RestTemplate

2023-05-16

一、 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包下的,这里记录全日志
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springcloud--服务调度OpenFeign、RestTemplate 的相关文章

随机推荐

  • 再次安装Arch Linux!(Vmware,KDE\Gnome桌面,EFI/BIOS引导,双系统配置)更新时间2018/11/11

    1 下载Arch Linux镜像 下载地址 xff1a https xff1a www archlinux org download 可以看到一个磁力一个种子 xff0c 任意下载一个并使用支持的下载软件进行镜像的下载 2 1 xff08
  • ozone调试

    对于keil编译的工程没法用gdb调试 xff08 我没发现方法 xff09 xff0c 那就用Ozone调试 xff0c 官网 https www segger com products development tools ozone j
  • pat1068

    对于计算机而言 xff0c 颜色不过是像素点对应的一个 24 位的数值 现给定一幅分辨率为 M N 的画 xff0c 要求你找出万绿丛中的一点红 xff0c 即有独一无二颜色的那个像素点 xff0c 并且该点的颜色与其周围 8 个相邻像素的
  • windows7系统下如何升级powershell(2.0升级到3.0版本)

    最近在使用vagrant命令时提示2 0的版本不支持需要升级powershell操作如下 查看本机powershell版本号 开始 运行 xff0c 输入powershell进入命令行窗口 在命令行中输入 PSVersionTable PS
  • python+pytesseract 中文识别

    继写了第一篇 包含验证码识别的自动化登录脚本后在一次与朋友聊天中谈到中文识别 想起Tesseract OCR是有这个包的 xff0c 然后我就搞了搞 coding 61 utf 8 from PIL import Image import
  • Codeforces1153A-Serval and Bus(数学)

    原题链接 xff1a http codeforces com contest 1153 problem A 题目原文 xff1a A Serval and Bus time limit per test 1 second memory li
  • tinode登录流程

    登录 交互消息 out是客户端发出 in是客户端接收 客户端发出hi消息 里面主要包括了版本 ua lang消息out span class token punctuation span span class token punctuati
  • While(true)无限循环

    while true 作为无限循环 xff0c 经常在不知道循环次数的时候使用 xff0c 并且需要在循环内使用break才会停止 run 方法中基本都会写while true 的循环 xff0c 如下 xff1a public class
  • python 判断两个字符串的相似度

    import difflib import Levenshtein def get equal rate 1 str1 str2 return difflib SequenceMatcher None str1 str2 quick rat
  • 关于wujian100 SDK中GPIO的调试问题

    学习笔记 问题一 xff1a 引脚电平不稳定问题二 xff1a 进入GPIO中断后出不来 第一次在CSDN写博客 xff0c 用来记录一些学习笔记 xff0c 小白一只 xff0c 如有不足之处望大家多多理解和指导 xff01 分享一下关于
  • 嵌入式C语言-关于if条件判断为真但不执行if块语句的问题

    关于if条件判断为真但不执行if块语句的问题 xff0c 我一直也还不是很清楚是什么原因造成的 在网上查看了一些网友的评论但回答也不是非常的准确 xff0c 或者说每个人遇到的情况都略有不同 我是在调试开发板的时候遇到两类这样的bug xf
  • UEFI模式下双系统安装并引导启动注意事项(RHLE7.9&WIN10)

    UEFI模式下双系统安装并引导启动注意事项 xff08 RHLE7 9 amp WIN10 xff09 引言新的改变资源链接注意事项 引言 就如同大佬说的一样 xff0c 知识也是需要与时俱进的 xff0c 在技术高速革新的时代 xff0c
  • WAV音频文件格式分析

    用notepad 43 43 gt gt plugins gt gt HexEditor notepad 43 43 的一个二进制编辑器插件 可以以16进制查看文件内容 打开一个波形文件如下 xff1a 所有WAV波形文件都可以套用一下一下
  • 使用 Petalinux 定制 Linux 系统

    离线编译petalinux 本文是基于Alinx FPGA开发板 xff08 AXU2CGA xff09 学习过程中踩过的坑 xff0c 以做记录 1 创建工程目录 xff1a 路径中 表示用户 home 路径 mkdir span cla
  • docker安装TensorFlow2.0 + jupyter lab。

    docker加虚拟机 xff0c 简直就是坑中埋雷 让我抱怨一下 我们开始进入主题 我的系统是ubuntu20 安装在虚拟机里 这个我就不再阐述过多了 大家都会 docker安装过程我也不多说了 xff0c 这个资料很多 那么我们直接进入主
  • Python 利用 curve_fit 进行 e 指数函数拟合

    可能对大家有参考价值的信息是 xff1a 如何用 curve fit 进行 e 指数函数拟合 xff1b 如何将拟合后的结果输出到画布上 xff1b 坐标轴 标签 图例样式的设计 xff1b 文本框内容和格式 话不多说 xff0c 直接上代
  • 简单搜索--马的走法

    描述 在一个4 5的棋盘上 xff0c 输入马的起始位置坐标 xff08 纵 横 xff09 xff0c 求马能返回初始位置的所有不同走法的总数 xff08 马走过的位置不能重复 马走 日 字 xff09 输入 多个测试数据 每组2个数 x
  • 用cephadm单节点安装ceph

    文章目录 官方文档参考安装虚拟机操作系统安装ntp lvm2配置时区安装docker安装cephadm验证 安装修改dashboard密码 安装ceph common查看可用存储添加存储验证 使用pool创建删除pool 块存储 xff08
  • Ubuntu18.04.6更新nvidia驱动后重启卡住

    这已经不是我第一次重装驱动无法重启了 xff0c 更新完驱动之后重启首先会卡在这样一个界面 xff1a 后来进行了这样的操作 xff1a 第一步 xff1a 重启Ubuntu系统开机按esc或shift xff0c 会进入启动选择页 xff
  • Springcloud--服务调度OpenFeign、RestTemplate

    一 RestTemplate RestTemplate是Spring提供的用于访问Rest服务的客户端 xff0c RestTemplate提供了多种便捷访问远程Http服务的方法 能够大大提高客户端的编写效率 1 基本使用 发送GET请求