SpringBoot之远程调用的三大方式

为什么要使用远程调用?
SpringBoot不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。在Spring-Boot项目开发中,存在着本模块的代码需要访问外面模块接口,或外部url链接的需求, 比如在apaas开发过程中需要封装接口在接口中调用apaas提供的接口(像发起流程接口submit等等)下面也是提供了三种方式(不使用dubbo的方式)供我们选择。
方式一:使用原始httpClient请求

public static Map<String, String> httpPostRequest(String url, Map<String, Object> params, int timeout) {Map<String, String> resultMap = new HashMap<>();CloseableHttpClient httpClient = HttpClients.createDefault();String result = "";try {HttpPost httpPost = new HttpPost(url);httpPost.addHeader("Content-Type", "application/json");String s = Base64.getEncoder().encodeToString(getAuthorization().getBytes());log.info("getAuthorization():{}", s);httpPost.addHeader("authorization", "Basic " + s);StringEntity se = new StringEntity(JSONObject.toJSONString(params), "utf-8");se.setContentEncoding("UTF-8");se.setContentType("application/json");httpPost.setEntity(se);HttpResponse response = httpClient.execute(httpPost);RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(timeout).setConnectionRequestTimeout(timeout).setSocketTimeout(timeout).build();httpPost.setConfig(requestConfig);HttpEntity responseEntity = response.getEntity();resultMap.put("scode", String.valueOf(response.getStatusLine().getStatusCode()));resultMap.put("data", "");if (responseEntity != null) {result = EntityUtils.toString(responseEntity, java.nio.charset.Charset.forName("UTF-8"));resultMap.put("data", result);}} catch (Exception e) {resultMap.put("scode", "error");resultMap.put("data", "HTTP请求失败: " + e.getMessage());Writer w = new StringWriter();e.printStackTrace(new PrintWriter(w));} finally {try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}return resultMap;}

方式二:使用RestTemplate
先封装哥工具类吧

public class RestTemplateUtils {private static final RestTemplate REST_TEMPLATE;static {HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();// 超时factory.setConnectTimeout(5000);factory.setReadTimeout(15000);SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(createIgnoreVerifySSL(),// 指定TLS版本null,// 指定算法null,// 取消域名验证new HostnameVerifier() {@Overridepublic boolean verify(String string, SSLSession ssls) {return true;}});CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();factory.setHttpClient(httpClient);REST_TEMPLATE = new RestTemplate(factory);// 解决中文乱码问题REST_TEMPLATE.getMessageConverters().set(1, new StringHttpMessageConverter(Charset.forName("UTF-8")));}public static RestTemplate getRestTemplate() {return REST_TEMPLATE;}/*** @param url    请求完整地址* @param method 请求方式* @param param  请求参数* @param cls    返回类型class* @param <T>    泛型* @return*/public static <T> T exchange(String url, HttpMethod method, Map param, Class<T> cls) {HttpHeaders headers = new HttpHeaders();headers.add("Content-Type", "application/json;charset=UTF-8");return exchange(url, method, headers, param, cls);}public static <T> T exchange(String url, HttpMethod method, HttpHeaders headers, Map param, Class<T> cls) {String jsonMap = "";if (headers == null) {headers = new HttpHeaders();headers.add("Content-Type", "application/json;charset=UTF-8");}HttpEntity formEntity = new HttpEntity(param, headers);ResponseEntity<T> result = REST_TEMPLATE.exchange(url, method, formEntity, cls);logger.info("【Info-Http】Request:" + url + "--|--" + JSON.toJSONString(param) + "--|--Result:" + JSON.toJSONString(result));return result.getBody();}public static String exchange(String url, HttpMethod method, Map param) {HttpHeaders headers = new HttpHeaders();headers.add("Content-Type", "application/json;charset=UTF-8");HttpEntity formEntity = new HttpEntity(param, headers);ResponseEntity<String> result = REST_TEMPLATE.exchange(url, method, formEntity, String.class);return result.getBody();}/*** 跳过证书效验的sslcontext** @return* @throws Exception*/private static SSLContext createIgnoreVerifySSL() {try {SSLContext sc = SSLContext.getInstance("TLS");// 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法X509TrustManager trustManager = new X509TrustManager() {@Overridepublic void checkClientTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,String paramString) throws CertificateException {}@Overridepublic void checkServerTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate,String paramString) throws CertificateException {}@Overridepublic java.security.cert.X509Certificate[] getAcceptedIssuers() {return null;}};sc.init(null, new TrustManager[]{trustManager}, null);return sc;} catch (Exception e) {log.info("建立 初始化异常");throw new RuntimeException();}}

方式三:使用Feign进行调用
1:主启动类添加
启动类上加上@EnableFeignClients

@SpringBootApplication
@EnableFeignClients
@ComponentScan(basePackages = {"com.xx.mp", "com.ap.*" ,"com.xdp.*"})
public class XxApplication {public static void main(String[] args) {SpringApplication.run(XxApplication .class, args);}}

2:此处编写接口模拟外部接口供feign调用外部接口方式使用
定义controller

@Autowired
PrintService printService;@PostMapping("/outSide")
public String test(@RequestBody TestDto testDto) {return printService.print(testDto);
}

定义service

@Service
public interface PrintService {public String print(TestDto testDto);
}

定义serviceImpl

public class PrintServiceImpl implements PrintService {@Overridepublic String print(TestDto testDto) {return "模拟外部系统的接口功能"+testDto.getId();}
}

构建Feigin的Service
定义service

//此处name需要设置不为空,url需要在.properties中设置
@Service
@FeignClient(url = "${outSide.url}", name = "service2")
public interface FeignService2 {@RequestMapping(value = "/custom/outSide", method = RequestMethod.POST)@ResponseBodypublic String getMessage(@Valid @RequestBody TestDto testDto);
}

定义controller

@Autowired
FeignService2 feignService2;
//测试feign调用外部接口入口
@PostMapping("/test2")
public String test2(@RequestBody TestDto testDto) {return feignService2.getMessage(testDto);
}

添加Header解决方法
将token等信息放入Feign请求头中,主要通过重写RequestInterceptor的apply方法实现
定义config

@Configuration
public class FeignConfig implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {//添加tokenrequestTemplate.header("token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJ4ZGFwYXBwaWQiOiIzNDgxMjU4ODk2OTI2OTY1NzYiLCJleHAiOjE2NjEyMjY5MDgsImlhdCI6MTY2MTIxOTcwOCwieGRhcHRlbmFudGlkIjoiMzAwOTgxNjA1MTE0MDUyNjA5IiwieGRhcHVzZXJpZCI6IjEwMDM0NzY2MzU4MzM1OTc5NTIwMCJ9.fZAO4kJSv2rSH0RBiL1zghdko8Npmu_9ufo6Wex_TI2q9gsiLp7XaW7U9Cu7uewEOaX4DTdpbFmMPvLUtcj_sQ");}
}

以上的是SpringBoot之远程调用的三大方式 若需完整代码 可识别二维码后 给您发代码。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/9030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 每日一题 ---- 【2079.给植物浇水】

LeetCode 每日一题 ---- 【2079.给植物浇水】 2079.给植物浇水方法&#xff1a;模拟-维护水的剩余量 2079.给植物浇水 方法&#xff1a;模拟-维护水的剩余量 模拟浇水和灌水的步骤就可以了&#xff0c;当剩余水大于等于需要浇的水&#xff0c;步数累加1即可&#xff0c;当剩余…

Golang 开发实战day13 - Reciver Functions

&#x1f3c6;个人专栏 &#x1f93a; leetcode &#x1f9d7; Leetcode Prime &#x1f3c7; Golang20天教程 &#x1f6b4;‍♂️ Java问题收集园地 &#x1f334; 成长感悟 欢迎大家观看&#xff0c;不执着于追求顶峰&#xff0c;只享受探索过程 Golang 开发实战day13 - 接收…

2万字长文:海豚调度器(DolphinScheduler)面试题深入了解

目录 海豚调度器的主要功能和特点 海豚调度器与Oozie、Azkaban等调度器相比的优势

第42天:WEB攻防-PHP应用MYSQL架构SQL注入跨库查询文件读写权限操作

第四十二天 一、PHP-MYSQL-SQL注入-常规查询 1.PHP-MYSQL-Web组成架构 MySQL(统一管理) ​ root&#xff08;自带默认&#xff09; ​ 网站A testA ​ 网站B testB MySQL(一对一管理) ​ testA用户 ​ 网站A testA ​ testB用户 ​ 网站B testB access无数据库用户 m…

三勾软件 / 三勾点餐系统门店系统,java+springboot+vue3

项目介绍 三勾点餐系统基于javaspringbootelement-plusuniapp打造的面向开发的小程序商城&#xff0c;方便二次开发或直接使用&#xff0c;可发布到多端&#xff0c;包括微信小程序、微信公众号、QQ小程序、支付宝小程序、字节跳动小程序、百度小程序、android端、ios端。 在…

LVS 负载均衡部署 NAT模式

一、环境准备 配置环境&#xff1a; 负载调度器&#xff1a;配置双网卡 内网&#xff1a;172.168.1.11(ens33) 外网卡&#xff1a;12.0.0.1(ens37)二台WEB服务器集群池&#xff1a;172.168.1.12、172.168.1.13 一台NFS共享服务器&#xff1a;172.168.1.14客户端&#xff…

Android的NDK开发中Cmake报缺少对应的x86的so文件

需要实现一个串口操作的命令。 供应商提供了2个so文件。 分别是 armeabi-v7a 和 arm64-v8a 添加到对应的cpp下。 在CMakeLists.txt里添加so文件 # 添加预编译的库 add_library(libxxx SHARED IMPORTED)# 设置库的路径 set_target_properties(libxxx PROPERTIES IMPORTED_…

springboot和html学院教务管理系统

端口号根据你实际运行程序的端口号来 访问地址&#xff1a;localhost:8080 学生 : student1 123456 管理员&#xff1a;admin 123456 老师&#xff1a;2020001 123456 sys_user 表是账号和密码

Android 11 新增设备支持语言

Android 系统默认支持多个国家语言。实现对整个android系统的语言设置,我们可以通过系统提供的 LocalePicker 里的方法来实现。 一、APP实现 1、权限设置 首先需要系统级的权限,在 AndroidManifest.xml 里申请权限: android:sharedUserId=“android.uid.system” <!--…

am62x edp屏调试

文章目录 am62x edp屏调试问题现象问题分析问题测试1 dtbo文件问题?2 ko文件问题3 驱动问题?4 问题定位:问题总结:附录设备结点:启动打印:am62x edp屏调试 问题现象 使用5.10内核配置的edp屏可以正常显示,但更新成6.1的内核后,不仅edp不正常工作,hdmi也不能正常工作…

隔离流量优化网络传输

不要将长流和短突发流(或者大象流和老鼠流)混部在一起&#xff0c;我建议用切片或虚通道将它们在全链路范围彻底隔离&#xff0c;而不仅仅在交换机上配合着大肆宣讲的高端包分类算法配置一些排队调度。 也不必扯泊松到达&#xff0c;帕累托分布&#xff0c;这些概念在论文建模…

Cocos Creator UlLabel的使用详解

前言 Cocos Creator是一款由Cocos公司开发的跨平台游戏开发引擎&#xff0c;它集成了Cocos2d-x引擎和Cocos Studio编辑器&#xff0c;可以帮助开发者快速地创建2D和3D游戏。在Cocos Creator中&#xff0c;UI系统是非常重要的一部分&#xff0c;而在UI系统中&#xff0c;UILabe…

Flutter笔记:Widgets Easier组件库(13)- 使用底部弹窗

Flutter笔记 Widgets Easier组件库&#xff08;13&#xff09;使用底部弹窗 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this …

使用HashMap实现,对一个字符集进行哈夫曼编码

最终达到的效果: 调用一个类 class HuffmanCodin{.....} 使用类中的静态方法&#xff0c;获取哈夫曼编码&#xff1a; 事前准备——哈夫曼树的节点定义 class Node implements Comparable<Node> {int weight;//权重Node left;Node right;char ch;//关键字&#xff0c…

单机轻松支持百万并发的go协程的简单tcpsocket服务端客户端通信小程序示例源码

单机轻松支持百万并发的go协程的简单tcpsocket服务端客户端通信小程序示例源码 服务端 server.go package mainimport ("bufio""fmt""io""net""os""strings""time" )// 简单的客户端服务端通信示例 /…

管理学SCI期刊,中科院4区,审稿快易录用,性价比超高!

一、期刊名称 Central European Journal of Operations Research 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;管理学 影响因子&#xff1a;1.7 中科院分区&#xff1a;4区 出版方式&#xff1a;订阅模式/开放出版 版面费&#xff1a;选择开放出版需…

人大金仓报The connection attempt failed.Reason:Connection reset解决办法

在连接人大京仓数据库 的时候报下面的错误 解决办法&#xff1a; 更换这里的IP地址就行&#xff0c;不要用127.0.0.1&#xff0c;然后就可以了

24.c++异常(异常的抛出和捕获、异常的重新抛出、抛出异常对象、抛出派生类对象、异常规范)

1.C语言传统的处理错误的方式 传统的错误处理机制&#xff1a; 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误&#xff0c;除0错误时就会终止程序。返回错误码&#xff0c;缺陷&#xff1a;需要程序员自己去查找对应的错误。如系统…

qq空间:图片批量下载js脚本工具,javascript批量下载图片

qq空间&#xff1a;图片批量下载js脚本工具&#xff0c;javascript批量下载图片 QQ空间很多老照片想下载&#xff0c;但是腾讯没放开&#xff0c;只能一张张下载太麻烦。用前端js写了一个脚本支持批量下载。另外就是空间内的照片会被压缩&#xff0c;过几年再看&#xff0c;个…

vscode的git插件使用教程

虽然git的命令我没有滚瓜烂熟&#xff0c;但vscode的git插件是尊嘟很好用啊&#xff0c;都被我用烂了。在网上看见一个讲的很不错的插件教程。借鉴一下。并在一些地方用块引用进行了补充说明&#xff01; 跳过了vscode安装过程。 克隆GitHub中的存储库&#xff1a; 1、复制Gi…