该系列项目整体介绍及源代码请参照前面写的一篇文章【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调用访问时会报以下错