欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 【springcloud学习(dalston.sr1)】服务消费者通过restTemplate来访问服务提供者(含源代码)(五)

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

2025/5/15 21:14:57 来源:https://blog.csdn.net/lichuangcsdn/article/details/147956837  浏览:    关键词:【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调用访问时会报以下错

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com