Spring Cloud Eureka 服务治理--服务消费

本文详细介绍了如何利用Spring Cloud Eureka实现服务治理,包括基础服务消费、Ribbon负载均衡和服务消费者Feign的使用。通过创建不同类型的消费者工程,如eureka-consumer、eureka-consumer-ribbon和eureka-consumer-feign,逐步展示了如何配置和调用Eureka注册中心上的服务。总结了三种服务消费方式的特点:基础版涉及RestTemplate和实例获取,Ribbon版通过@LoadBalanced简化调用,Feign版则提供声明式服务调用。
摘要由CSDN通过智能技术生成

这篇文章主要介绍如何使用Spring Cloud Eureka来实现服务治理--服务消费 ,是一个总结 记录 方便自己记忆。

文章知识 均来自以下系列文章,请参考原文

 Spring Cloud构建微服务架构:服务消费(基础)【Dalston版】

Spring Cloud构建微服务架构:服务消费(Ribbon)【Dalston版】

Spring Cloud构建微服务架构:服务消费(Feign)【Dalston版】

使用Spring Cloud Eureka来实现服务治理

3.1 服务消费 :创建服务消费者 并消费 eureka-client提供的服务--基础版

使用Spring Cloud提供的负载均衡器客户端接口 LoadBalancerClient接口 实现服务的消费。通LoadBalancerClient接口来获取某个服务的具体实例,并根据实例信息来发起服务接口消费请求。

Step1:创建一个Spring Boot项目 eureka-consumer(服务消费者工程),添加 spring-cloud-starter-netflix-eureka-server 起步依赖

Step2:在项目入口类添加@EnableDiscoveryClient 注解,激活Eureka中的DiscoveryClient实现,将当前应用加入到服务治理体系中。

Step3:在application.properties文件添加配置

#微服务的名称:后续在调用的时候只需要使用该名称就可以进行服务的访问
spring.application.name=eureka-consumer
#微服务端口
server.port=2101
 
#指定服务注册中心的位置
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/

Step4:在配置类中初始化RestTemplate,用来真正发起REST请求。

	@Bean
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}

Step5: 创建一个接口用来消费eureka-client提供的接口

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class DiscoveryClientController {

	@Autowired
	private LoadBalancerClient loadBalancerClient;

	@Autowired
	private RestTemplate restTemplate;

	@GetMapping("/consumer")
	public String discoveryClient() {

		// 利用LoadBalancerClient负载均衡的选出一个eureka-client的服务实例,把这个服务实例的基本信息存储在ServiceInstance中
		ServiceInstance serviceInstance = loadBalancerClient.choose("eureka-client");
		// 拼接出访问/dc接口的详细地址
		String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "discoveryClient";
		System.out.println("url==" + url);

		// 利用RestTemplate对象实现对服务提供者接口的调用。
		String services = restTemplate.getForObject(url, String.class);
		return services;
	}
}

Step6:启动eureka-server,eureka-client,eureka-consumer。并访问http://localhost:2101/consumer 。就会看到eureka-consumer服务是如何消费eureka-client服务的/discoveryClient接口的

 

3.2 服务消费 :创建服务消费者 并消费 eureka-client提供的服务--Ribbon

基础版 通过LoadBalancerClient接口实现服务的消费,需要我们手工编写服务的选择,链接拼接等操作,对于开发人员不友好。所以Spring Cloud针对客户端负载均衡提供了工具包Spring Cloud Ribbon。

Spring Cloud Ribbon

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它是一个基于HTTP和TCP的客户端负载均衡器。它可以通过在客户端中配置ribbonServerList来设置服务端列表去轮询访问以达到均衡负载的作用。

当Ribbon与Eureka联合使用时,ribbonServerList会被DiscoveryEnabledNIWSServerList重写,扩展成从Eureka注册中心中获取服务实例列表。同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来确定服务端是否已经启动。

我们在使用Spring Cloud Ribbon的时候,不论是与Eureka还是Consul结合,都会在引入Spring Cloud Eureka或Spring Cloud Consul依赖的时候通过自动化配置来加载上述所说的配置内容,所以我们可以快速在Spring Cloud中实现服务间调用的负载均衡。

使用Spring Cloud Ribbon来实现服务的调用以及客户端均衡负载。

Step1:创建Spring Boot项目eureka-consumer-ribbon,添加起步依赖 spring-cloud-starter-netflix-eureka-server,spring-cloud-starter-netflix-ribbon。

Step2:在项目入口类添加@EnableDiscoveryClient注解,将当前应用 添加到 服务治理体系中。

Step3:在application.properties文件中配置微服务

#微服务的名称:后续在调用的时候只需要使用该名称就可以进行服务的访问
spring.application.name=eureka-consumer-ribbon
#微服务端口
server.port=2201

#指定服务注册中心的位置
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/

Step4:在配置类中初始化RestTemplate,用来真正发起REST请求。并增加@LoadBalanced注解

	@Bean
	@LoadBalanced
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}

Step5: 创建一个接口用来消费eureka-client提供的接口 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class DiscoveryClientController {

	@Autowired
	private RestTemplate restTemplate;

	@GetMapping("/consumer")
	public String discoveryClient() {
		String services = restTemplate.getForObject("http://eureka-client/discoveryClient", String.class);
		return services;
	}
}

Step6:启动eureka-server,eureka-client,eureka-consumer-ribbon。并访问http://localhost:2201/consumer 。就会看到eureka-consumer-ribbon服务是如何消费eureka-client服务的/discoveryClient接口的

总结:使用 Spring Cloud Ribbon 的@LoadBalanced 注解 ,就可以使用 服务名和接口url 去调用服务。 因为Spring Cloud Ribbon有一个拦截器,它能够在这里进行实际调用的时候,自动的去选取服务实例,并将实际要请求的IP地址和端口替换这里的服务名,从而完成服务接口的调用。

3.3 服务消费 :创建服务消费者 并消费 eureka-client提供的服务--Feign

Spring Cloud Feign
Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端。它使得编写Web服务客户端变得更加简单。
我们只需要通过创建接口并用注解来配置它既可完成对Web服务接口的绑定。它具备可插拔的注解支持,包括Feign注解、JAX-RS注解。它也支持可插拔的编码器和解码器。
Spring Cloud Feign还扩展了对Spring MVC注解的支持,同时还整合了Ribbon和Eureka来提供均衡负载的HTTP客户端实现。

使用Feign方便的声明对eureka-client服务的定义和调用

Step1:创建Spring Boot项目eureka-consumer-feign,添加起步依赖 spring-cloud-starter-netflix-eureka-server,spring-cloud-starter-openfeign

Step2:在项目入口类添加@EnableDiscoveryClient注解,将当前应用 添加到 服务治理体系中。

Step3:在application.properties文件中配置微服务

#微服务的名称:后续在调用的时候只需要使用该名称就可以进行服务的访问
spring.application.name=eureka-consumer-feign
#微服务端口
server.port=2301

#指定服务注册中心的位置
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/

Step4:在配置类 添加  @EnableFeignClients注解,开启扫名Spring Cloud Feign客户端功能。

Step5:创建一个Feign的客户端接口定义。使用@FeignClient注解来指定这个接口所要调用的服务名称,接口中定义的各个函数使用Spring MVC的注解就可以来绑定服务提供方的REST接口,比如下面就是绑定eureka-client服务的/discoveryClient接口的例子:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;

@Service
@FeignClient("eureka-client")
public interface DiscoveryClientService {

	@GetMapping("/discoveryClient")
	public String consumer();
}

Step6:创建controller ,通过定义的feign客户端来调用服务提供方的接口

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DiscoveryClientController {

	@Autowired
	private DiscoveryClientService discoveryClientService;

	@GetMapping("/comsumer")
	public String comsumer() {
		String services = discoveryClientService.consumer();

		return services;
	}
}

Step7:启动eureka-server,eureka-client,eureka-consumer-feign。并访问http://localhost:2301/consumer 。就会看到eureka-consumer-feign服务是如何消费eureka-client服务的/discoveryClient接口的

总结:通过Spring Cloud Feign来实现服务调用的方式更加简单了。通过@FeignClient定义的接口来统一的声明我们需要依赖的微服务接口,而在具体使用的时候就跟调用本地方法一点的进行调用即可
由于Feign是基于Ribbon实现的,所以它自带了客户端负载均衡功能,也可以通过Ribbon的IRule进行策略扩展。
另外,Feign还整合的Hystrix来实现服务的容错保护,在Dalston版本中,Feign的Hystrix默认是关闭的。待后文介绍Hystrix带领大家入门之后,我们再结合介绍Feign中的Hystrix以及配置方式。

 

3种方式总结对比:

基础版:用Spring Cloud的LoadBalancerClient接口 获取获取某个服务的具体实例,链接拼接。并通过RestTemplate发起REST请求。

Ribbon版:用Spring Cloud的@LoadBalanced注解 通过服务提供者的服务名 ,并通过RestTemplate发起REST请求。和基础版相比 不再需要拼接服务url

Feign版:把服务提供者 通过@FeignClient注解 定义成 服务消费者的一个接口。服务提供者的方法 可以定义成接口中的方法。在服务消费者方 通过调用接口的方式 调用其它微服务的方法。

3种方式可以互为替代。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值