【springcloud学习(dalston.sr1)】服务消费者通过restTemplate来访问服务提供者(含源代码)(五)

news2025/7/19 10:06:42

该系列项目整体介绍及源代码请参照前面写的一篇文章​​​​​​【springcloud学习(dalston.sr1)】项目整体介绍(含源代码)(一)

一般情况下,我们远程调用服务,可以用restTemplate来进行http请求的访问。接下来,我们会创建一个服务消费者,利用restTemplate来调用服务提供者的接口localhost:8001/goods/list

前面我们创建好了eureka服务端模块 microservicecloud-eureka-7001和服务提供者项目microservicecloud-provider-8001。

(一)启动eureka服务端模块 microservicecloud-eureka-7001和服务提供者项目microservicecloud-provider-8001

我们首先启动eureka服务端项目和服务提供者项目,然后确认服务提供者能正常访问,在浏览器输入链接地址:localhost:8001/goods/list 

(二)创建服务消费者项目

该模块创建后的整体代码结构如下microservicecloud-consumer-80

(1)pom文件内容如下:

<?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">
    <parent>
        <artifactId>springcloud2025</artifactId>
        <groupId>com.company</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>microservicecloud-consumer-80</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.company</groupId>
            <artifactId>microservicecloud-api</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- ribbon相关 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

    </dependencies>

</project>

(2)创建应用配置文件application.yml

server:
  port: 80

eureka:
  client:
    register-with-eureka: false #false表示不向注册中心注册自己
    service-url:
      defaultZone: http://localhost:7001/eureka/  #如果是访问eureka集群,则配置为http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

(3)创建启动类

package com.company.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class Consumer80Application {

    public static void main(String[] args) {
        SpringApplication.run(Consumer80Application.class, args);
    }
}

(4)创建controller

package com.company.consumer.controller;

import com.company.api.entity.Goods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
@RequestMapping("/consumer")
public class GoodsConsumerContrller {

    /**
     * http URL
     */
    private static final String REST_URL_PREFIX_HTTP = "http://localhost:8001";

    /**
     * 通过应用名称的访问地址(应用名称等同于IP + 端口)
     */
    private static final String REST_URL_PREFIX_APPLICATION_SERVICE_NAME = "http://MICROSERVICECLOUD-GOODS";

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/goods/list/http")
    public List<Goods> getGoodsHttp() {
        return restTemplate.exchange(REST_URL_PREFIX_HTTP + "/goods/list", HttpMethod.GET,
                null,   new ParameterizedTypeReference<List<Goods>>(){}).getBody();
    }

    @GetMapping("/goods/list/applicationName")
    public List<Goods> getGoodsServiceName() {
        return restTemplate.exchange(REST_URL_PREFIX_APPLICATION_SERVICE_NAME + "/goods/list", HttpMethod.GET,
             null,   new ParameterizedTypeReference<List<Goods>>(){}).getBody();
    }

    @GetMapping("/goods/list/hystrix")
    public List<Goods> getGoodsHystrix() {
        return restTemplate.exchange(REST_URL_PREFIX_APPLICATION_SERVICE_NAME + "/goods/list/hystrix", HttpMethod.GET,
                null,   new ParameterizedTypeReference<List<Goods>>(){}).getBody();
    }
}

(5)创建一个配置类,将restTemplate纳入到spring 容器进行管理

package com.company.consumer.config;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;
import com.netflix.loadbalancer.RoundRobinRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ConfigBean {

    @Bean
    //@LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    /**
     * 设置ribbon负载均衡的算法,默认是轮询算法,也即每个都轮询一次。
     * @return
     */
    //@Bean
    public IRule myRule() {
         return new RoundRobinRule();// 默认是轮询算法,也即每个都轮询一次。
        // return new RandomRule(); 现在采用随机的算法
        //return new RetryRule(); //如果provider都是正常的话,则轮询。如果有1个不可用的话,则在尝试几次失败后,会自动轮询能正常使用的服务
    }
}

(三)启动服务消费者项目,验证效果

这里注意,我们前面已经事先启动好了eureka服务端模块 microservicecloud-eureka-7001和服务提供者项目microservicecloud-provider-8001

现在我们使用restTemplate通过IP + 端口方式调用服务提供者的接口(使用http://localhost/consumer/goods/list/http)

通过服务消费者microservicecloud-consumer-80模块的创建,我们在controller中定义了接口/consumer/goods/list/http ,并且在该接口中通过restTemplate来访问服务提供者microservicecloud-provider-8001

的 localhost:8001/goods/list接口。

我们启动服务消费者项目microservicecloud-consumer-80,然后在浏览器中访问 http://localhost/consumer/goods/list/http

如果结果能正常返回,则说明通过restTemplate调用成功

如下图:

(2)使用服务名称进行调用(代替IP + 端口方式)(使用http://MICROSERVICECLOUD-GOODS/consumer/goods/list/http)

由于该项目也是作为Eureka的客户端,其调用也可以通过服务名称方式进行直接调用。

比如服务提供方的地址是 localhost:8001/goods/list ,从eureka注册列表可以看到服务名称是MICROSERVICECLOUD-GOODS

如下图:

注意eureka服务提供者的名称,取决于服务提供者项目microservicecloud-provider-8001中的application.yml配置文件中的spring.application.name=microservicecloud-goods配置项,eureka server端网页里会展示为大写

由于通过服务名需要启用负载均衡注解 @LoadBalanced,这里需要修改下配置Bean,去掉前面的注释(前面通过IP + 端口方式访问时,通过//注释掉了该注解),以正式启用该注解,如下图

这里我们尝试访问http://localhost/consumer/goods/list/applicationName,该接口的url里换成了服务名,如下图:

在浏览器中访问http://localhost/consumer/goods/list/applicationName,页面正常展示返回结果,说明能通过服务名称来访问到服务提供者的接口。

注意:因为@LoadBalanced这个注解是加在restTemplate上面的,如果还想通过IP + 端口方式访问,则需要注掉该注解,否则进行restTemplate调用访问时会报以下错

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

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

相关文章

打破边界,智评未来:AI如何重塑学科交叉融合的评价体系?

目录: 引言:当“学科孤岛”遇上“创新浪潮”透视现状:学科交叉融合的“热望”与“冰壁”他山之石:国际交叉融合模式与评价的“镜与灯”AI赋能:重构学科交叉评价的内涵、要素与方法论 4.1. 基本内涵:从“知识叠加”到“价值涌现”4.2. 评价要素:超越“单点指标”的“网络…

ULVAC C30HMVRT系列冷冻泵和超捕集器压缩机组 安装、操作、维护和故障排除说明 含电路图

ULVAC C30HMVRT系列冷冻泵和超捕集器压缩机组 安装、操作、维护和故障排除说明 含电路图

ORACLE查看归档是否打开

一、使用V$DATABASE视图 SELECT log_mode FROM v$database; 结果说明&#xff1a; ARCHIVELOG - 数据库处于归档模式 NOARCHIVELOG - 数据库处于非归档模式 二、 使用v$instance视图 SELECT archiver FROM v$instance; 结果说明&#xff1a; STARTED - 归档进程已启动(归档模…

鸿蒙5.0项目开发——鸿蒙天气项目的实现(介绍)

【高心星出品】 文章目录 项目简介&#xff1a;项目运行效果图&#xff1a;主要功能&#xff1a;使用的技能点&#xff1a;开发环境&#xff1a; 项目简介&#xff1a; 这是一个基于鸿蒙系统&#xff08;HarmonyOS&#xff09;开发的天气应用&#xff0c;采用 ArkTS 语言开发&…

3Dblox

TSMC 3Dblox Introduction 3Dblox是TSMC定义的一门语言&#xff0c;目标是将物理封装系统分解为模块化的组件&#xff0c;然后进行集成 RDL : 代表interposer的部分 Die的实例化信息 堆叠信息 连接信息 thickness&#xff1a;Die与Die连接Bump的高度 RedHawk-SC-Electrothermal…

Python+大模型 day01

Python基础 计算机系统组成 基础语法 如:student_num 4.标识符要做到见名知意,增强代码的可读性 关键字 系统或者Python定义的,有特殊功能的字符组合 在学习过程中,文件名没有遵循标识符命名规则,是为了按序号编写文件方便查找复习 但是,在开发中,所有的Python文件名称必须…

磁光克尔效应在量子计算中的应用

一、量子自旋态光学操控 1、‌拓扑量子态探测‌ 磁光克尔效应通过检测拓扑磁结构&#xff08;如磁斯格明子&#xff09;的磁光响应&#xff0c;实现对量子材料中非平庸拓扑自旋序的非侵入式表征。例如&#xff0c;二维量子磁体中的“拓扑克尔效应”可通过偏振光旋转角变化揭示…

Vue.js---嵌套的effect与effect栈

4.3嵌套的effect与effect栈 1、嵌套的effect effect是可以发生嵌套的 01 effect(function effectFn1() { 02 effect(function effectFn2() { /* ... */ }) 03 /* ... */ 04 })有这么一段代码&#xff1a; 01 // 原始数据 02 const data { foo: true, bar: true } 03 /…

AAAI-2025 | 电子科大类比推理助力精准识别!SPAR:基于自提示类比推理的无人机目标探测技术

作者&#xff1a; Nianxin Li, Mao Ye, Lihua Zhou, Song Tang, Yan Gan, Zizhuo Liang, Xiatian Zhu 单位&#xff1a;电子科技大学计算机科学与工程学院&#xff0c;上海理工大学机器智能研究所&#xff0c;重庆大学计算机学院&#xff0c;谢菲尔德大学&#xff0c;萨里大学…

速查 Linux 常用指令 II

目录 一、网络管理命令1. 查看和配置网络设备&#xff1a;ifconfig1&#xff09;重启网络命令2&#xff09;重启网卡命令 2. 查看与设置路由&#xff1a;route3. 追踪网络路由&#xff1a;traceroute4. 查看端口信息和使用情况1&#xff09;netstat 命令2&#xff09;lsof 命令…

IIS服务器URL重写配置完整教程

1.下载URL Rewrite Module 2.1 https://www.iis.net/downloads/microsoft/url-rewrite https://download.microsoft.com/download/1/2/8/128E2E22-C1B9-44A4-BE2A-5859ED1D4592/rewrite_amd64_zh-CN.msi 2.安装

注解和 XML 两种方式有什么区别?

注解和 XML 是两种常见的配置方式&#xff08;尤其在 Java 开发中&#xff0c;如 Spring 框架&#xff09;&#xff0c;它们的主要区别体现在配置方式、代码耦合性、可读性、维护性等方面。以下是两者的对比&#xff1a; 1. 配置方式 注解&#xff08;Annotation&#xff09; 在…

高速系统设计实例设计分析二

6.6 仿真约束的生成和实施 进行到这一步&#xff0c;我们已经完成了对实例进行仿真的所有条件的设置&#xff0c;包括对板子的设计要求分析和预布局处理。虽然从技术上讲&#xff0c;我们可以开始进行仿真分析并生成设计的约束&#xff0c;但是根据作者的工作经验&#xff0c;…

【MySQL】变更缓冲区:作用、主要配置以及如何查看

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

C2S-Scale:Cell2Sentence v2

目前的单细胞基础模型&#xff08;scFMs&#xff09;在可扩展性、跨多种任务的灵活性以及整合文本信息的能力方面仍然有限。基于Cell2Sentence&#xff08;C2S&#xff09;框架展开工作&#xff0c;该框架将单细胞RNA测序&#xff08;scRNA-seq&#xff09;图谱表示为文本形式的…

技术伦理双轨认证如何重构AI工程师能力评估体系——基于AAIA框架的技术解析与行业实证研究

引言&#xff1a;AI工程师能力评估的范式转型 2025年全球人工智能产业呈现出两大特征&#xff1a;技术迭代加速与监管框架完善。据Gartner数据显示&#xff0c;全球75%的企业在AI项目部署中遭遇技术伦理混合型难题&#xff0c;传统单维度技术认证体系已无法满足产业需求。本文…

ubuntu20.04系统搭建k8s1.28集群-docker作为容器运行时

ubuntu系统搭建 ubuntu-22.04.5-desktop-amd64.iso映像文件--->实际却是20.4focal版本。 【安装过程没有特别指出的默认回车下一步】 【用户和密码设置】 【网络连接】 【在vmware上安装的话&#xff0c;网络配置如下】【在vm里配置选择nat或者桥接即可】 【国内源配置】&…

【Alist+RaiDrive挂载网盘到本地磁盘】

1.安装准备 安装RaiDrive RaiDrive - 像 USB 驱动器一样安装云存储 安装alist 安装方式请查看官网: AList文档 2.启动Alist(docker) docker官网 Install | Docker EngineDocker Desktop | Docker Docs 运行容器 docker run -d --restartalways -v /home/alist:/opt/alist/…

vue实现进度条带指针

效果最终 function calculatePointerPosition(value) {if (value < 2.6) return 12.5; // 非常差位置if (value < 5.1) return 37.5; // 较差位置if (value < 7.1) return 62.5; // 良好位置return 90; // 非常满意位置 }function getStatusText(value) {if (valu…

Kafka Go客户端--Sarama

Kafka Go客户端 在Go中里面有三个比较有名气的Go客户端。 Sarama:用户数量最多&#xff0c;早期这个项目是在Shopify下面&#xff0c;现在挪到了IBM下。segmentio/kafka-go:没啥大的缺点。confluent-kafka-go&#xff1a;需要启用cgo,跨平台问题比较多&#xff0c;交叉编译也…