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


本文介绍如何跨服务调用后端接口,包含三种方式:

  1. 从前端使用AJAX调用后端接口
  2. 在后端使用HttpURLConnection访问接口
  3. 在后端配合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微服务之跨服务调用后端接口的更多相关文章

  1. axios解决调用后端接口跨域问题

    vue-cli通过是本地代理的方式解决接口跨域问题的.但是在vue-cli的默认项目配置中这个代理是没有配置的,如果现在项目中使用,必须手动配置config/index.js文件 ... proxyT ...

  2. jquery中的jsonp跨域调用(接口)

                                                                           jquery jsonp跨域调用接口

  3. Nginx解决前端调用后端接口跨域问题

    1.项目中遇到的问题描述: 前端调用zuul统一网关服务接口,请求状态码200,但是无返回数据. 浏览器控制台报错信息:No  Access-Control-Allow-Origin header i ...

  4. 使用javascript把图片转成base64位编码,然后传送到服务端(ajax调用的接口基于drupa7)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  5. 前端调用后端接口下载excel文件的几种方式

    今天有一个导出相应数据为excel表的需求.后端的接口返回一个数据流,一开始我用axios(ajax类库)调用接口,返回成功状态200,但是!但是浏览器没有自动下载excel表,当时觉得可能是ajax ...

  6. 前端调用后端接口返回200(成功状态码),后端有返回,但是控制台Network Response为空,没展示任何信息

    解决方法: 1.在js里面debugger,可以看到后台是否有返回数据. 2.直接console.log(),直接把返回值打印出来,查看返回的数据格式,方便前端进行数据的处理. PS:因为后端返回的数 ...

  7. 解决Vue调用springboot接口403跨域问题

    最近在做一个前后端分离的项目, 前端用的是Vue后端使用的是springboot, 在项目整合的时候发现前端调用后端接口报错403跨域请求问题 前端跨域请求已解决, 那么问题就出在后端了, 找了一些资 ...

  8. express:webpack dev-server开发中如何调用后端服务器的接口?

    开发环境:     前端:webpack + vue + vue-resource,基于如下模板创建的开发环境: https://github.com/vuejs-templates/webpack  ...

  9. nginx解决跨域(前后端分离)

    Nginx解决跨域问题 后端接口 请求地址 返回数据(json数据) http://127.0.0.1:8080//app Hello World! 前端代码 通过nginx做静态资源服务器访问端口8 ...

随机推荐

  1. [USACO07JAN]Cow School

    题目链接:[USACO07JAN]Cow School 一开始还以为是一道分数规划,后来发现自己看错题了, 然后成功入坑 题目是要求先按照$t_i/p_i$从小到大排序,然后删除前$d$个后求出剩下的 ...

  2. 【hihocoder 1628】K-Dimensional Foil(线性代数)

    hihocoder 1627 The 2017 ACM-ICPC Asia Beijing Regional Contest 北京区域赛 B.K-Dimensional Foil 题意 给定N个点的前 ...

  3. ansible 开源批量管理服务器工具

    Ansible 是一款基于 Python 开发的自动化运维工具,可以进行配置管理.批量部署等功能.对于机器较多的场景,可以使用 Ansible 来免去重复敲命令的烦恼. 安装ansibleyum -y ...

  4. css文本设置

    常用的应用文本的css样式: color 设置文字的颜色,如: color:red; font-size 设置文字的大小,如:font-size:12px; font-family 设置文字的字体,如 ...

  5. [模板] 动态dp

    用途 对于某些树形dp(目前只会树上最大权独立集或者类似的),动态地修改点权,并询问修改后的dp值 做法(树剖版) 以最大权独立集为例 设$f[x][0/1]$表示x选不选,这棵子树的最大权独立集大小 ...

  6. javascript之复习(框架里的方法们)

    继上次整理,一些东西没有整理完.就写在这.可能比较乱比较杂,因为都是整理的一些东西,也没有到做成专题的程度. 1.String.repeat() 大家要实现重复一个字符串的重复怎么写呢,反正我的第一想 ...

  7. django(六)之ORM数据库操作

    https://www.cnblogs.com/haiyan123/p/7732190.html 一.ORM介绍 ORM——object relation mapping 映射关系: 表名 ----- ...

  8. touch-paint

    效果如下 代码如下: //index.html <!DOCTYPE html> <html lang="zh-CN"> <head> <m ...

  9. navicat premium 12破解流程

    具体步骤:这是破解的具体链接 仅此记录,以供后续之需

  10. PMP项目管理考试培训机构内部资料打包赠送(3个PPT)

    PMP认证考试我自己这边是今年6月份考过了的,手里觉得对自己有帮助的资料就是这3个PPT,讲解的比较清晰,知识点详细.结合自己做的笔记,备考十分轻松.所以推荐大家也看一下. 有需要的可以联系. PPT ...