当前位置: 首页 > news >正文

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

该系列项目整体介绍及源代码请参照前面写的一篇文章​​​​​​【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: 80eureka: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";@Autowiredprivate 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//@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}/*** 设置ribbon负载均衡的算法,默认是轮询算法,也即每个都轮询一次。* @return*///@Beanpublic 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调用访问时会报以下错

相关文章:

  • 仿生眼机器人(人脸跟踪版)系列之一
  • 基于EFISH-SCB-RK3576/SAIL-RK3576的智能零售柜技术方案
  • Web 架构之会话保持深度解析
  • 使用GRPO训练调度事件的语言模型!
  • Vue3学习(组合式API——Watch侦听器详解)
  • TTS-Web-Vue系列:Vue3实现侧边栏与顶部导航的双向联动
  • 【愚公系列】《Manus极简入门》038-数字孪生设计师:“虚实映射师”
  • elementplus el-tree 二次封装支持配置删除后展示展开或折叠编辑复选框懒加载功能
  • 02_Servlet
  • Python模块引用
  • 鸿蒙OSUniApp 实现一个精致的日历组件#三方框架 #Uniapp
  • NSSCTF [HNCTF 2022 WEEK4]
  • CS4334立体声D/A转换器:为高品质音频设计提供低成本的解决方案
  • Vue 和 React 状态管理的性能优化策略对比
  • C#高级编程:IO和序列化
  • 【SSL部署与优化​】​​HTTP/2与HTTPS的协同效应
  • OkHttp连接池
  • Spring集成Redis中禁用主机名DNS检测
  • springboot AOP 接口限流(基于IP的接口限流和黑白名单)
  • 在Oracle到GreatSQL迁移中排序规则改变引发的乱码问题分析及解决
  • 经济日报评外卖平台被约谈:行业竞争不能背离服务本质
  • “一百零一个愿望——汉字艺术展”亮相意大利威尼斯
  • 极限拉扯上任巴西,安切洛蒂开启夏窗主帅大挪移?
  • 比特币挖矿公司GRYP股价涨超171%:将与特朗普儿子创设的公司合并
  • 生态环境保护督察工作条例对督察对象和内容作了哪些规定?有关负责人答问
  • “海豚音”依旧,玛丽亚·凯莉本周来沪开唱