微服务的消费 | 从0开始构建SpringCloud微服务(11)

25次阅读

共计 3114 个字符,预计需要花费 8 分钟才能阅读完成。

照例附上项目 github 链接
本项目实现的是将一个简单的天气预报系统一步一步改造成一个 SpringCloud 微服务系统的过程。本章主要讲解微服务的消费。

微服务的消费模式
微服务的消费模式主要有:

服务直连模式
客户端发现模式
服务端发现模式

下面我们主要讲解客户端发现模式,以及服务端发现模式。

客户端发现模式
客户端发现模式的具体流程如下:
1)服务实例启动后,将自己的位置信息提交到服务注册表中。
2)客户端从服务注册表进行查询,来获取可用的服务实例。
3)客户端自行使用负载均衡算法从多个服务实例中选择出一个。

服务端发现模式
服务端发现模式与客户端发现模式的区别在于:服务端发现模式的负载均衡由负载均衡器(独立的)来实现,客户端不需要关心具体调用的是哪一个服务。

微服务的消费者
下面我们价格介绍一些常见的微服务的消费者。

HttpClient
HttpClient 是常见的微服务的消费者,它是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

Ribbon
Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于 Netflix Ribbon 实现。通过 Spring Cloud 的封装,可以让我们轻松地将面向服务的 REST 模版请求自动转换成客户端负载均衡的服务调用。
Ribbon 常与 Eureka 结合使用。在典型的分布式部署中,Eureka 为所有的微服务提供服务注册,Ribbon 提供服务消费的客户端,含有许多负载均衡的算法。

Feign
Feign 是一个声明式的 Web Service 客户端,它的目的就是让 Web Service 调用更加简单。Feign 提供了 HTTP 请求的模板,通过编写简单的接口和插入注解,就可以定义好 HTTP 请求的参数、格式、地址等信息。
而 Feign 则会完全代理 HTTP 请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Feign 整合了 Ribbon 和 Hystrix(关于 Hystrix 我们后面再讲),可以让我们不再需要显式地使用这两个组件。
总起来说,Feign 具有如下特性:

可插拔的注解支持,包括 Feign 注解和 JAX-RS 注解;
支持可插拔的 HTTP 编码器和解码器;
支持 Hystrix 和它的 Fallback;
支持 Ribbon 的负载均衡;
支持 HTTP 请求和响应的压缩。

集成 Feign
本节我们主要讲解如何集成 Feign,实现微服务的消费功能。

添加配置
pom.xml 配置文件,添加如下依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
application.yml 文件,添加如下配置
服务的名称与工程的名称一致,并且设置请求一个服务的 connect 与 read 的超时时间。
spring:
application:
name: micro-weather-eureka-client-feign
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
feign:
client:
config:
feignName:
connectTimeout: 5000
readTimeout: 5000

添加注解
添加 @EnableFeignClients 注解,启动 Feign 功能。
package com.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableScheduling;

//@ServletComponentScan(basePackages=”com.demo.web.servlet”)
@SpringBootApplication
@EnableDiscoveryClient
@EnableScheduling
@EnableFeignClients
public class Sifoudemo02Application {

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

创建 Feign 客户端
创建一个 Feign 客户端,通过其 CityClient 的接口,可以调用城市数据 API 微服务 mas-weather-city-eureka 中的 cities 接口,返回城市列表。
package com.demo.service;

import java.util.List;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.demo.vo.City;

// 创建一个 Feign 客户端 获取城市数据微服务中的城市列表信息
@FeignClient(“msa-weather-city-eureka”)
public interface CityClient {
@RequestMapping(value=”/cities”,method=RequestMethod.GET)
List<City> listCity()throws Exception;
}

使用 Feign 客户端
@RestController
public class CityController{
@Autowired
private CityClient cityClient;

@GetMapping(“/cities”)
public List<City> listCity(){
List<City> cityList=cityClient.listCity();
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190311174443475.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTU1Mjg3,size_16,color_FFFFFF,t_70) return cityList;
}
}

测试
先启动 Eureka 服务端,然后启动被请求的微服务——城市数据 API 微服务,最后启动 Feign 客户端。

正文完
 0