SpringCloud学习笔记二:服务间调用

news2024/11/17 1:27:47

微服务中,很多服务系统都在独立的进程中运行,通过各个服务系统之间的协作来实现一个大项目的所有业务功能。服务系统间 使用多种跨进程的方式进行通信协作,而RESTful风格的网络请求是最为常见的交互方式之一。

spring cloud提供的方式:

1.RestTemplate
2.Feign

一、服务提供者创建

在上一篇文章中我们介绍了服务的注册与发现,在此基础上我们将之前创建的eureka-client作为服务消费方创建一个服务提供方。

1.按照上篇文章中创建eureka-client的方式创建eureka-provider

 其中application的配置如下

#指定启动端口号
server.port=5202

#设置服务注册中心的URL,用于client和server端交流
eureka.client.service-url.defaultZone=http://localhost:5200/eureka/

#指定服务名称
spring.application.name=eureka-provide


2.创建服务提供方的ProviderController
1.在包下创建controller.ProviderController,如下图:

2.写入被调用的提供方法
package shadowcoder.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProviderController {
        @GetMapping("/hello")
        public String hello() {
            return "Hello from Eureka Provider!";
        }
}

二、RestTemplate方式调用

RestTemplate是Spring框架提供的一个工具类,主要用于简化访问RESTful服务的过程。它是从Spring3.0开始支持的一个HTTP请求工具,它封装了底层的HTTP请求细节,让我们可以以更加优雅和简洁的方式调用RESTful API。

1.启动类配置一个RestTemplate的Bean,并标记为@LoadBalanced,以便Spring Cloud能够为其添加负载均衡支持
package com.shadowcoder;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaClientApplication.class, args);
	}
	@Bean
	@LoadBalanced // 使得RestTemplate具有负载均衡的能力
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}

}
2.在eureka-client包下创建controller.ConsumerController,结构如图

3.在ConsumerController写入调用服务提供者的API:/call-hello1
package com.shadowcoder.controller;

import com.netflix.appinfo.InstanceInfo;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.netflix.discovery.EurekaClient;

import java.util.List;

@RestController
public class ConsumerController {

    @Autowired
    EurekaClient client;


    private final RestTemplate restTemplate;


    @Autowired
    public ConsumerController(RestTemplateBuilder restTemplateBuilder) {
        this.restTemplate = restTemplateBuilder.build();
    }

    @GetMapping("/call-hello")
    public String callHello() {
        //获取服务名为eureka-provide的服务实例
        List<InstanceInfo> instances = client.getInstancesByVipAddress("eureka-provide", false);
        InstanceInfo instanceInfo = instances.get(0);
        //打印调用的接口
        System.out.println("http://" + instanceInfo.getHostName() +":"+ instanceInfo.getPort() + "/hello");
        String url = "http://" + instanceInfo.getHostName() +":"+ instanceInfo.getPort() + "/hello";
        //服务提供者的API
        String response = restTemplate.getForObject(url, String.class);
        return "Response from Service Provider: " + response;
    }

}

(备注):通过打印的调用接口发现 实际调用的是eureka的主机名而不是spring.application.name的eureka-provider

4.测试调用接口:/call-hello1

访问localhost:5201/call-hello可以发现出现成功调用了eureka-provide的/hello方法

三、Feign方式调用

Feign是一个声明式的Web服务客户端,它使得编写HTTP客户端变得更简单。在Spring Cloud中,Feign可以很容易地与Eureka等服务发现机制集成,从而实现对微服务的调用。

1.在eureka-client中添加Feign依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.shadowcoder</groupId>
        <artifactId>SpringCloudTest</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>eureka-client</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

</project>
2.启动类上添加@EnableFeignClients注解来启用Feign客户端,代码如下
package com.shadowcoder;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class EurekaClientApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaClientApplication.class, args);
	}
	@Bean
	@LoadBalanced // 使得RestTemplate具有负载均衡的能力
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}

}
3.包下新增一个接口service.ConsumerService

代码如下:

package com.shadowcoder.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(value = "eureka-provide")//value填写提供方的spring.application.name=eureka-provide
public interface ConsumerService {
    //提供方的调用API
    @GetMapping("/hello")
    String hello();
}
4.在ConsumerController注入ConsumerService以及写入调用服务提供者的API:/call-hello2
package com.shadowcoder.controller;

import com.netflix.appinfo.InstanceInfo;
import com.shadowcoder.service.ConsumerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.netflix.discovery.EurekaClient;

import java.util.List;

@RestController
public class ConsumerController {

    @Autowired
    EurekaClient client;
    @Autowired
    private ConsumerService consumerService;
    private final RestTemplate restTemplate;


    @Autowired
    public ConsumerController(RestTemplateBuilder restTemplateBuilder) {
        this.restTemplate = restTemplateBuilder.build();
    }

    @GetMapping("/call-hello")
    public String callHello() {
        //获取服务名为eureka-provide的服务实例
        List<InstanceInfo> instances = client.getInstancesByVipAddress("eureka-provide", false);
        InstanceInfo instanceInfo = instances.get(0);
        //打印调用的接口
        System.out.println("http://" + instanceInfo.getHostName() + ":" + instanceInfo.getPort() + "/hello");
        String url = "http://" + instanceInfo.getHostName() + ":" + instanceInfo.getPort() + "/hello";
        //服务提供者的API
        String response = restTemplate.getForObject(url, String.class);
        return "Response from Service Provider: " + response;
    }


    @GetMapping("/call-hello2")
    public String callHello2() {
        return "Response from Service Provider2: " + consumerService.hello();
    }


}

5.测试调用接口:/call-hello2

访问localhost:5201/call-hello2可以发现出现成功调用了eureka-provide的/hello方法

备注(提示):

1.要在启动类中加入@EnableFeignClients注解,以便Spring Cloud能够扫描到@FeignClient注解并创建Feign客户端。
2.Feign主要通过接口调用,底层实现是HttpClient或OkHttp。在定义Feign接口时,需要加入对应的Rest接口,并设置接口的参数。如果接口参数是对象或Map,应使用@RequestBody注解;如果参数是字符串,应使用@RequestParam注解。

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

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

相关文章

基于springboot实现在线拍卖系统项目【项目源码+论文说明】

基于springboot实现在线拍卖系统演示 摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍…

jsp指令和动作

1.page指令&#xff1a;描述页面信息 pageENcoding:软件编码 contentType&#xff1a;浏览器编码 2.include指令&#xff1a;将多个网页合成一个网页&#xff0c;静态包含网页 问题&#xff1a;1.在网页源代码中&#xff0c;会形成错误的多遍代码&#xff0c;将主页面代码和…

MySQL中如何进行多表查询

目录 一、子查询 1.什么是子查询 2.注意事项 二、联结查询 1.什么是联结 2.内部联结&#xff08;等值联结&#xff09; ①WHERE语句 ②ON语句 3.自联结 4.自然联结 5.外部联结 三、组合查询 1.什么是组合查询 2.UNION规则 *本节涉及概念来源于图灵程序设计丛书&a…

成功推出全新生成式AI的四大原则

生成式AI有望从根本上打开一扇新世界机遇的大门&#xff0c;以满足各行各业的客户需求。从提供个性化回复的对话式聊天机器人&#xff0c;到各种应用的代码&#xff0c;再到营销传播的目标内容&#xff0c;生成式AI正在彻底改变企业的运作方式。为竞相提供卓越的客户体验&#…

jupyter lab 自动补全

命令行执行&#xff1a; pip install jupyter-lsp pip install python-lsp-server[all] jupyter lab直接搜索&#xff0c;并安装&#xff0c;重启后生效

使用`scipy.stats.wasserstein_distance`来计算两个一维分布之间的Earth Mover‘s Distance (EMD)距离

在Python中&#xff0c;计算Earth Mover’s Distance (EMD)通常使用scipy库中的scipy.stats.wasserstein_distance函数&#xff0c;该函数计算的是Wasserstein距离&#xff0c;它与EMD非常相似&#xff0c;都是用来衡量两个分布之间的距离。 以下是一个简单的Python程序例子&a…

Web框架开发-BBS(表、登录、注册、文件上传)

一、博客系统表关系 models.py 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79…

DID分析:上市公司专精特新认定的长期影响(5W+数据)

参照陈金勇&#xff08;2024&#xff09;等人的做法&#xff0c;将上市公司与国家级专精特新小巨人、省级专精特新小巨人、国家级专精特新中小企业、省级专精特新中小企业名单数据进行匹配。包含4类认定标准和年份&#xff0c;并利用四类认定标准分别构建了四类多期DID 一、数据…

进程、线程、协程与虚拟线程(进程相关)

进程、线程、协程与虚拟线程 这一次我们从头&#xff0c;从最大的先开始说&#xff0c;我们从进程开始&#xff0c;因为内容比较多&#xff0c;所以我们分为几个不同的文章来介绍。先从进程&#xff0c;再从线程&#xff0c;最后介绍协程与虚拟线程。 简介 我们以一张操作系…

自动驾驶传感器:惯性导航IMU原理

自动驾驶传感器&#xff1a;惯性导航IMU原理 附赠自动驾驶学习资料和量产经验&#xff1a;链接 组合导航里包含了GNSS卫星导航模块与IMU惯性导航模块&#xff0c;前一篇文章写了GNSS模块&#xff0c;本章写IMU惯导&#xff0c;也是本系列最后一篇文章。 1. 惯性测量单元&…

让 AI 帮你写代码,开发提效神器来了

如今&#xff0c;大量程序员已经习惯在 AI 辅助下进行编程。据调研&#xff0c;AI 编码工具将程序员工作效率提升 50% 以上。 通义灵码是目前国内最受开发者喜爱的 AI 编码助手&#xff0c;可以提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、…

回顾皆草木,唯你是青山~

新中式小飞袖连衣裙 每一件衣裳都是时间的礼赞 是炎炎夏日的一抹清新 传统元素与现代时尚设计相结合 面料舒适透气&#xff0c;裙摆飘逸灵动 宛如林间自由洒脱的小仙子~

【Java】IDEA集成开发工具中英文切换

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章。 这是《Java》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识…

众望所归:FoxPro之后,可视化编程再现新突破,国产力作

许多以前的计算机语言&#xff0c;至今仍然展现出它们强大的生命力。 DOS时代下的FoxPro 然而&#xff0c;曾经风靡一时的FoxPro语言&#xff0c;如今已逐渐淡出人们的视野&#xff0c;令人不禁感慨万分。 每当提及FoxPro&#xff0c;总是有着无尽的话题和回忆。 想当年&am…

65W智能快充—同为科技桌面PDU插座推荐

近10年&#xff0c;移动设备的智能化、功能化已经完全且紧密的融入到我们的基础生活与工作当中。 在常态化的电子设备的应用中&#xff0c;设备的电力续航以及后续的供电充电就尤为重要。 就目前而言&#xff0c;所有消费电子产品中的输入以及充电的接口&#xff0c;usb-c可以…

大模型入门(一)

大模型入门&#xff08;一&#xff09; 一、LLaMa 模型介绍1&#xff09;Pre-normalization2&#xff09;SwiGLU激活函数3&#xff09;RoPE旋转位置编码 二、Alpaca 模型介绍三、Vicuna 模型介绍 大模型入门&#xff08;一&#xff09;—— LLaMa/Alpaca/Vicuna   LLaMa模型是…

每日学习笔记:C++ STL迭代器特性(Iterator Trait)、自定义迭代器

迭代器特性(Iterator Trait) 注意不同的迭代器种类类型之前有继承关系&#xff1a; 为迭代器编写泛型函数 自定义迭代器 实例

几种靠谱的企业大文件安全传输方式,最后一种绝了

在数字化的浪潮中&#xff0c;企业的数据安全传输显得尤为关键。随着远程办公和云技术的普及&#xff0c;企业在保护敏感信息不被外泄方面面临着新的挑战。本文将探讨几种有效的企业数据安全传输方法&#xff0c;并着重阐述其中一种方法如何作为全面的解决方案&#xff0c;提供…

【2024系统架构设计】案例分析- 3 数据库

目录 一 基础知识 二 真题 一 基础知识 1 ORM ORM(Object—Relationl Mapping

探索AI大模型学习的未来之路

文章目录 一、引言二、AI大模型学习的理论基础2.1 深度学习2.2 数据处理 三、AI大模型的训练优化与应用实例3.1 训练优化3.2 AI大模型在特定领域的应用实例 四、AI大模型学习的注意点五、AI大模型学习的未来发展趋势与挑战5.1 发展趋势5.2 所面对的挑战 六、结论 一、引言 随着…