SpringCloud微服务之跨服务调用后端接口
SpringCloud微服务系列博客:
SpringCloud微服务之快速搭建EurekaServer:https://blog.csdn.net/egg1996911/article/details/78787540
SpringCloud微服务之注册服务至EurekaServer:https://blog.csdn.net/egg1996911/article/details/78859200
SpringCloud微服务之集成thymeleaf访问html页面/静态页面&热部署:https://blog.csdn.net/egg1996911/article/details/78885045
SpringCloud微服务之部署SpringBoot项目至Linux服务器(CentOS):https://blog.csdn.net/egg1996911/article/details/78975945
SpringCloud微服务之使用SpringBoot搭建后端服务&配置MyBatis框架:https://blog.csdn.net/egg1996911/article/details/80215554
本文介绍如何跨服务调用后端接口,包含三种方式:
- 从前端使用AJAX调用后端接口
- 在后端使用HttpURLConnection访问接口
- 在后端配合Eureka发现服务,使用RestTemplate调用接口
说明:
- 从前端使用AJAX调用后端接口时,容易出现JS跨域问题,SpringBoot中解决跨域访问的方法见博客:https://blog.csdn.net/egg1996911/article/details/79901620
- 方式1和方式2需要知道被访问的服务的ip地址
- 方式3需要保证调用服务的一方和被调用服务的一方都注册在同一个Eureka Server上
因此,如果是微服务体系架构,那么使用方式3是最好的选择。方式3可以不用自己去管理服务ip信息,这样在被调用服务的部署地址发生变化时,不需要修改自己的配置,而方式1和方式2都需要重新配置被调用服务的ip信息
以下均以从microapp调用microimage的服务接口为例:
1、使用AJAX调用后端接口
function loadImages() {
$.ajax({
url: "localhost:8089/images/getAll",
type: "GET",
data: {},
async: false,
timeout: 5000,
success: function (data) {
for (var i = 0; i < data.length; i++) {
var li = $('<li></li>');
li.addClass("box");
var a = $('<a></a>');
a.attr("href", data[i].url);
a.addClass("magnifier");
var img = $('<img/>');
img.attr("alt", data[i].description);
img.attr("src", data[i].url);
img.attr("height", "270px");
img.attr("width", "370px");
img.appendTo(li);
img.appendTo(a);
a.appendTo(li);
li.appendTo($("#images"));
}
},
error: function (xhr, textStatus) {
}
})
}
其中url参数处要填写出被调用服务的ip:port/接口名,调用成功后接口返回值即为success函数中的data
2、使用HttpUrlConnection访问接口
可以参考我的另一篇博文:https://blog.csdn.net/egg1996911/article/details/73822803
3、使用Eureka发现服务并调用接口
在启动类中配置RestTemplate:
package com.deng.site;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.nio.charset.StandardCharsets;
@EnableDiscoveryClient
@SpringBootApplication
public class MicroAppApplication {
public static void main(String[] args) {
SpringApplication.run(MicroAppApplication.class, args);
}
@LoadBalanced
@Bean
RestTemplate restTemplate(){
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8));
return restTemplate;
}
}
调用MICROIMAGE微服务接口:
package com.deng.site.service.impl;
import com.deng.site.service.ImageService;
import com.deng.site.vo.ImageVO;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@Service
@PropertySource(value = {"classpath:application.properties"}, encoding = "utf-8")
public class ImageServiceImpl implements ImageService {
@Autowired
private RestTemplate restTemplate;
@Value("${gateway.url}")
private String gateway;
@Override
public List<ImageVO> getAllImages() {
List<ImageVO> imageVOs = new ArrayList<>();
String url = "http://MICROIMAGE/images/getAll";
String result = restTemplate.getForObject(url, String.class);
ObjectMapper objectMapper = new ObjectMapper();
try {
JsonNode jsonRes = objectMapper.readTree(result);
for (int i = 0; i < jsonRes.size(); i++) {
JsonNode jsonNode = jsonRes.get(i);
String description = jsonNode.path("description").asText();
String imageUrl = gateway + "/microimage/images/" + jsonNode.path("fileName").asText() + "/get";
imageVOs.add(new ImageVO(description, imageUrl));
}
} catch (IOException e) {
e.printStackTrace();
}
return imageVOs;
}
}
- URL的构成为:”https://”+注册在Eureka上的服务名称+调用的接口名(http://MICROIMAGE/images/getAll)
- 根据接口支持的http方法的不同,使用RestTemplate提供的不同方法,比如对get接口使用getForObject,post接口使用postForObject
- 使用ObjectMapper转换接口返回的json数据
SpringCloud微服务之跨服务调用后端接口的更多相关文章
- axios解决调用后端接口跨域问题
vue-cli通过是本地代理的方式解决接口跨域问题的.但是在vue-cli的默认项目配置中这个代理是没有配置的,如果现在项目中使用,必须手动配置config/index.js文件 ... proxyT ...
- jquery中的jsonp跨域调用(接口)
jquery jsonp跨域调用接口
- Nginx解决前端调用后端接口跨域问题
1.项目中遇到的问题描述: 前端调用zuul统一网关服务接口,请求状态码200,但是无返回数据. 浏览器控制台报错信息:No Access-Control-Allow-Origin header i ...
- 使用javascript把图片转成base64位编码,然后传送到服务端(ajax调用的接口基于drupa7)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 前端调用后端接口下载excel文件的几种方式
今天有一个导出相应数据为excel表的需求.后端的接口返回一个数据流,一开始我用axios(ajax类库)调用接口,返回成功状态200,但是!但是浏览器没有自动下载excel表,当时觉得可能是ajax ...
- 前端调用后端接口返回200(成功状态码),后端有返回,但是控制台Network Response为空,没展示任何信息
解决方法: 1.在js里面debugger,可以看到后台是否有返回数据. 2.直接console.log(),直接把返回值打印出来,查看返回的数据格式,方便前端进行数据的处理. PS:因为后端返回的数 ...
- 解决Vue调用springboot接口403跨域问题
最近在做一个前后端分离的项目, 前端用的是Vue后端使用的是springboot, 在项目整合的时候发现前端调用后端接口报错403跨域请求问题 前端跨域请求已解决, 那么问题就出在后端了, 找了一些资 ...
- express:webpack dev-server开发中如何调用后端服务器的接口?
开发环境: 前端:webpack + vue + vue-resource,基于如下模板创建的开发环境: https://github.com/vuejs-templates/webpack ...
- nginx解决跨域(前后端分离)
Nginx解决跨域问题 后端接口 请求地址 返回数据(json数据) http://127.0.0.1:8080//app Hello World! 前端代码 通过nginx做静态资源服务器访问端口8 ...
随机推荐
- [USACO07JAN]Cow School
题目链接:[USACO07JAN]Cow School 一开始还以为是一道分数规划,后来发现自己看错题了, 然后成功入坑 题目是要求先按照$t_i/p_i$从小到大排序,然后删除前$d$个后求出剩下的 ...
- 【hihocoder 1628】K-Dimensional Foil(线性代数)
hihocoder 1627 The 2017 ACM-ICPC Asia Beijing Regional Contest 北京区域赛 B.K-Dimensional Foil 题意 给定N个点的前 ...
- ansible 开源批量管理服务器工具
Ansible 是一款基于 Python 开发的自动化运维工具,可以进行配置管理.批量部署等功能.对于机器较多的场景,可以使用 Ansible 来免去重复敲命令的烦恼. 安装ansibleyum -y ...
- css文本设置
常用的应用文本的css样式: color 设置文字的颜色,如: color:red; font-size 设置文字的大小,如:font-size:12px; font-family 设置文字的字体,如 ...
- [模板] 动态dp
用途 对于某些树形dp(目前只会树上最大权独立集或者类似的),动态地修改点权,并询问修改后的dp值 做法(树剖版) 以最大权独立集为例 设$f[x][0/1]$表示x选不选,这棵子树的最大权独立集大小 ...
- javascript之复习(框架里的方法们)
继上次整理,一些东西没有整理完.就写在这.可能比较乱比较杂,因为都是整理的一些东西,也没有到做成专题的程度. 1.String.repeat() 大家要实现重复一个字符串的重复怎么写呢,反正我的第一想 ...
- django(六)之ORM数据库操作
https://www.cnblogs.com/haiyan123/p/7732190.html 一.ORM介绍 ORM——object relation mapping 映射关系: 表名 ----- ...
- touch-paint
效果如下 代码如下: //index.html <!DOCTYPE html> <html lang="zh-CN"> <head> <m ...
- navicat premium 12破解流程
具体步骤:这是破解的具体链接 仅此记录,以供后续之需
- PMP项目管理考试培训机构内部资料打包赠送(3个PPT)
PMP认证考试我自己这边是今年6月份考过了的,手里觉得对自己有帮助的资料就是这3个PPT,讲解的比较清晰,知识点详细.结合自己做的笔记,备考十分轻松.所以推荐大家也看一下. 有需要的可以联系. PPT ...