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



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

  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数据

原文地址:https://www.cnblogs.com/jpfss/p/10760913.html

时间: 2024-11-10 00:22:48

SpringCloud微服务之跨服务调用后端接口的相关文章

ElementUI Form 调用后端接口校验

使用ElementUI Form 校验时,如果需要调用后端接口进行校验的话,那么使用自定义验证规则 var validateCode = (rule, value, callback) => { if (value === '') { callback(new Error('请输入岗位编码')); } else if (value.length > 50) { callback(new Error('岗位编码不超过50个字符')); } else if (!/^[a-zA-Z][a-zA-Z0

小程序调用后端接口服务 配置文件详解

前言:为了开发阶段的效率更高,方便项目接口管理,在做web项目时,我们需要把后端提供的接口地址进行配置,这样我们自己在调用时,要方便得多,利己利人.在配置小程序接口地址时,和web的配置大同小异,下面总结几点配置小程序接口地址的思路: 1.所有接口地址,要丢在一个对象里[为了方便下面解释,这里设置一个对象名:config],为什么了,因为要对外暴露,方便外部访问,这样[key:value]方式是最合理的,那就是对象了. 2.真实接口地址,也就是对象键值对的value,要用英文模式下Tab键的上一

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

vue-cli通过是本地代理的方式解决接口跨域问题的.但是在vue-cli的默认项目配置中这个代理是没有配置的,如果现在项目中使用,必须手动配置config/index.js文件 ... proxyTable: { '/api': { //将www.exaple.com印射为/apis target: 'https://www.example.com, // 接口域名 secure: true, // 如果是https接口,需要配置这个参数 changeOrigin: true, //是否跨域

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

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script src='http://code.jquery.com/jquery-1.9.1.min.js'></script> <script src='jquery.base64.js'><

解决ajax跨域调用C#接口

第一个方法,通过jsonp方式调用 缺点:不过只支持get方式请求,所以携带的数据有限制.如果需要提交大量的数据就不行了. 第二个方法,使用cors方式:要在C#后台代码里增加返回头respose.addHeader("Access-Control-Allow-Origin","http://test.com");    如果是公共的则返回*即可. 优点:可以使用post请求 缺点:只支持部分浏览器

前端提供一个接口或者调用后台接口,这个接口具体指什么

ajax 我给你一个例子 (function () { var timing = null; console.log($(".name").length) timing=setInterval(function () { $.ajax( { type: "post", url: "http://t1.loocha.cn:9880/link/anchor/finalcompetitor?activityId=40987", data: {}, da

【微服务】之五:轻松搞定SpringCloud微服务-调用远程组件Feign

上一篇文章讲到了负载均衡在Spring Cloud体系中的体现,其实Spring Cloud是提供了多种客户端调用的组件,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Apache的Http Client.Netty的异步HTTP Client, Spring的RestTemplate.但是,用起来最方便.最优雅的还是要属Feign了.今天这一篇文章是系列教程中第五篇,也是对负载均衡的第二篇,主

springcloud微服务实战:Eureka+Zuul+Ribbon+Hystrix+SpringConfig

原文地址:http://blog.csdn.net/yp090416/article/details/78017552 springcloud微服务实战:Eureka+Zuul+Ribbon+Hystrix+SpringConfig 相信现在已经有很多小伙伴已经或者准备使用springcloud微服务了,接下来为大家搭建一个微服务框架,后期可以自己进行扩展.会提供一个小案例: 服务提供者和服务消费者 ,消费者会调用提供者的服务,新建的项目都是用springboot,附源码下载. coding仓库

springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin

参考:springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin 原创 2017年09月18日 11:46:28 标签: 微服务架构 / 微服务组件 / eureka / ribbon / zuul 26459 springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin 相信现在