Spring Cloud 學(xué)習(xí)筆記04----服務(wù)消費(fèi)者(RestTemplate+Ribbon(客戶端負(fù)載均衡))

簡(jiǎn)介

上一篇《Spring Cloud 學(xué)習(xí)筆記02----服務(wù)治理》我們講到了服務(wù)的注冊(cè)與發(fā)現(xiàn),在微服務(wù)框架中,我們將服務(wù)拆分成一個(gè)個(gè)獨(dú)立部署的子服務(wù),這些服務(wù)通過(guò)http rest 來(lái)通訊的,Spring Cloud有兩種服務(wù)調(diào)用方式,一種是 RestTemplate+Ribbon, 另外一種是Feign 。

Ribbon 簡(jiǎn)介

Ribbon 是一個(gè)基于HTTP和TCP的客戶端負(fù)載均衡工具。Feign默認(rèn)集成了Ribbon。
Spring Cloud Netflix默認(rèn)情況下為Ribbon(BeanType beanName:ClassName)提供以下bean
IClientConfig ribbonClientConfig:DefaultClientConfigImpl

IRule ribbonRule:ZoneAvoidanceRule

IPing ribbonPing:NoOpPing

ServerList ribbonServerList:ConfigurationBasedServerList

ServerListFilter ribbonServerListFilter:ZonePreferenceServerListFilter

ILoadBalancer ribbonLoadBalancer:ZoneAwareLoadBalancer

ServerListUpdater ribbonServerListUpdater:PollingServerListUpdater

準(zhǔn)備工作

本示例的demo 是在我們上一個(gè)示例的基礎(chǔ)上擴(kuò)展的。首先我們eureka-server 啟動(dòng),然后,啟動(dòng)order-provider,端口號(hào)設(shè)置為2001,然后,在application.yml將端口號(hào)設(shè)置成2002,再啟動(dòng)order-provider。
啟動(dòng)成功之后我們可以在Eureka面板上看到ORDER-SERVICE注冊(cè)了兩個(gè)服務(wù),相當(dāng)于一個(gè)小集群。
在這里插入圖片描述

建一個(gè)服務(wù)消費(fèi)者

我們?cè)谛陆ㄒ粋€(gè)spring boot 項(xiàng)目,將它命名為service-ribbon,

  1. 添加依賴
    在pom文件中添加的依賴了spring-cloud-starter-netflix-eureka-client,spring-boot-starter-web,spring-cloud-start-ribbon的依賴
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.2.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.jay</groupId>
	<artifactId>service-ribbon</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>service-ribbon</name>
	<description>ribbon demo</description>

	<properties>
		<java.version>1.8</java.version>
		<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
	</properties>

	<dependencies>
		<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>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-start-ribbon</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
		</dependency>

	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
  1. application.yml 文件中添加如下配置,配置了端口號(hào),應(yīng)用名,已經(jīng)眾測(cè)中心地址。
server:
  port: 8764
eureka:
  client:
    service-url:
#    用于指定注冊(cè)中心的地址
      defaultZone: http://localhost:1111/eureka/
spring:
  application:
    name: service-ribbon
  1. 在啟動(dòng)類(lèi)ServiceRibbonApplication 中添加如下注解。其中:@EnableEurekaClient 表示激活Eureka 中的DiscoveryClient 實(shí)現(xiàn),其是基于spring-cloud-netflix依賴,只能為Eureka作用。(ps :如果注冊(cè)中心不為Eureka 的話,則推薦@EnableDiscoveryClient,其是基于spring-cloud-commons依賴,并且在classpath中實(shí)現(xiàn)。)
    并向IOC 容器中注入了一個(gè)RestTemplate的實(shí)例,通過(guò)@LoadBalanced 表示開(kāi)啟負(fù)載均衡的功能。
@SpringBootApplication
@EnableEurekaClient
public class ServiceRibbonApplication {

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

	@Bean
	@LoadBalanced
	RestTemplate restTemplate() {
		return new RestTemplate();
	}
}
  1. 我們新建一個(gè)HelloService 通過(guò)rest 的方式調(diào)用服務(wù),通過(guò)服務(wù)名來(lái)調(diào)用服務(wù),看看是否起到了負(fù)載均衡的功能。這里ribbon 會(huì)根據(jù)服務(wù)名來(lái)調(diào)用具體的服務(wù)實(shí)例,根據(jù)服務(wù)實(shí)例在請(qǐng)求時(shí)會(huì)將服務(wù)名替換成具體的url。代碼如下:
@Service
public class HelloService {

    @Autowired
    RestTemplate restTemplate;

    public String getOrderService() {
        return restTemplate.getForObject("http://ORDER-SERVICE/dc",String.class);
    }
}
  1. 然后新建一個(gè)controller 測(cè)試下,服務(wù)的調(diào)用情況。
@RestController
public class HelloController {

    @Autowired
    private HelloService helloService;

    @RequestMapping("/getOrderService")
    public String getOrderService() {
        return helloService.getOrderService();
    }
}

測(cè)試結(jié)果如下:多次調(diào)用會(huì)交替顯示。

在這里插入圖片描述
在這里插入圖片描述

此時(shí)的架構(gòu)

在這里插入圖片描述

源碼地址:

https://github.com/XWxiaowei/SpringCloud-Learning/tree/master/2-Finchley版教程示例/Chapter4-1

參考:

史上最簡(jiǎn)單的SpringCloud教程 | 第二篇: 服務(wù)消費(fèi)者(rest+ribbon)



作者:碼農(nóng)飛哥

微信公眾號(hào):碼農(nóng)飛哥