欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Cloud 学习第二章:服务消费者restTemplate+ribbon

程序员文章站 2022-03-15 23:20:00
...

参考博客地址:https://blog.csdn.net/forezp/article/details/81040946

前言:上一章,学习了服务的注册与发现,微服务架构中,一般都会根据业务来拆分模块成一个独立的服务,Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。这篇文章学习下基于 ribbon+rest 来进行调用。

一、ribbon 简介

ribbon是一个负载均衡客户端,可以很好的控制 http 和 tcp 的一些行为。而Feign默认集成了ribbon。

ribbon 已经默认实现了下面这些配置bean:

IClientConfig ribbonClientConfig: DefaultClientConfigImpl

IRule ribbonRule: ZoneAvoidanceRule

IPing ribbonPing: NoOpPing

ServerList ribbonServerList: ConfigurationBasedServerList

ServerListFilter ribbonServerListFilter: ZonePreferenceServerListFilter

ILoadBalancer ribbonLoadBalancer: ZoneAwareLoadBalancer

二、准备工作

1、继续使用上一章学习的工程,分别启动 eureka-server、eureka-client

如何一个工程启动多个实例,请参考这篇文章:

再将 eureka-client 的配置文件的端口改为8763,并启动(由于我这边多次测试一个工程启动多个实例,始终存在些许问题,所以我这边增加了一个 eureka-client2 ,工程内容和 eureka-client 一样,只是将端口改为8763)

访问 http://localhost:8761/,你会发现多出来一个服务,这就相当于一个小集群了
Spring Cloud 学习第二章:服务消费者restTemplate+ribbon

三、创建一个服务消费者 eureka-ribbon

1、选择springboot 工程,勾选依赖
Spring Cloud 学习第二章:服务消费者restTemplate+ribbon

2、创建完成之后,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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.wxw</groupId>
		<artifactId>springcloud</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>

	<groupId>com.wxw</groupId>
	<artifactId>eureka-ribbon</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>eureka-ribbon</name>
	<description>Demo project for Spring Boot</description>


	<!--ribbon 依赖-->
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
		</dependency>

		<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>
	</dependencies>


	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

3、application.yml 配置文件如下,
指定服务注册中心:http://localhost:8761/eureka/
端口:8764 , 服务名:eureka-ribbon

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8764
spring:
  application:
    name: eureka-ribbon

4、springboot 启动类做如下更改
通过这两个注解向服务中心进行注册
@EnableEurekaClient
@EnableDiscoveryClient

同时注入 restTemplate bean,加入注解:@LoadBalanced
表示 restTemplate 开启负载均衡的功能

Spring Cloud 学习第二章:服务消费者restTemplate+ribbon

5、创建一个 service 测试类,
通过之前注入的 restTemplate 来消费 eureka-client 服务的 hello 接口方法,这里直接用服务名替代 url 地址,在 ribbon 中它会根据服务名来选择具体的服务实例,根据服务实例在请求的时候会用具体的url替换掉服务名。

@Service
public class HelloService {

    @Autowired
    RestTemplate restTemplate;

     public String hello(String name){
        return restTemplate.getForObject("http://EUREKA-CLIENT/hello?name="+name,String.class);
    }
}

6、创建一个 controller 测试类 调用 service 测试类

@RestController
public class HelloController {
    @Autowired
    HelloService helloService;



    @RequestMapping("/hello")
    public String hello(@RequestParam(value = "name",defaultValue = "wxw") String name){
        return helloService.hello(name);
    }
}

7、启动 eureka-ribbon 工程, 访问 http://localhost:8764/hello
Spring Cloud 学习第二章:服务消费者restTemplate+ribbon

一直点击刷新按钮,可以看到端口会 在8762 和 8763 之间来回切换

四、此时的整体架构

一个服务注册中心,eureka-server,端口为8761

eureka-client 和 eureka-client2 工程跑了两个实例,端口分别为8762,8763,分别向服务注册中心注册

sercvice-ribbon 端口为8764,向服务注册中心注册

当 eureka-ribbon 通过 restTemplate 调用 eureka-client 的 hello 接口时,因为用ribbon进行了负载均衡,会轮流的调用 eureka-client :8762和8763 两个端口的 hello 接口;