三、微服务分布式电商系统--SpringCloud分布式组件Nacos注册中心、配置中心、OpenFeign远程调用、GateWay网关
【摘要】
在分布式开发中,首先我们必须要知道注册中心、配置中心和网关这三个概念。
每一个微服务上线都需要将他自己注册到注册中心,这样做的好处就是如果一个服务想要调用另外一个服务,这个服务就可以去注册中心寻找哪几个服务上线了,就可以找到对应的服务调用了。各个服务的配置众多,如果商品服务在10台机器上都有,想要改配置很麻烦,有一个配置中心集中管理。前端发过来的请求经过统一的鉴权、过滤、路由等由网关抵达后台的服务,做一些预先的工作。
前言
https://spring.io/projects/spring-cloud-netflix
SpringCloud Alibaba
SpringCloud Alibaba简介
简介
Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用的必须组件,方便开发者通过Spring Cloud编程模型轻松快速使用这些组件来开发分布式应用服务。
依托Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将SpringCloud应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
https://github.com/alibaba/spring-cloud-alibaba
为什么使用它?
Spring Cloud的几大痛点:
- SpringCloud部分组件停止维护和更新,给开发带来不便。
- SpringCloud部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发。
- SpringCloud配置复杂,难以上手,部分配置差别难以区分和合理使用。
Spring Cloud Alibaba的优势:
- 阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源状态。
- 成套的产品搭配完善的可视化界面给开发运维带来极大的便利。
- 搭建简单,学习曲线低。
结合Spring Cloud Alibaba我们最终的技术搭配方案:
- SpringCloud Alibaba - Nacos:注册中心(服务发现/注册)
- SpringCloud Alibaba - Nacos:配置中心(动态配置管理)
- SpringCloud - Ribbon:负载均衡
- SpringCloud - Feign:声明式HTTP客户端(调用远程服务)
- SpringCloud Alibaba - Sentinel:服务容错(限流、降级、熔断)
- SpringCloud - Gateway:API网关(webflux 编程模式)
- SpringCloud - Sleuth:调用链监控
- SpringCloud Albaba -Seata:原Fescar,即分布式事务解决方案
版本选择
由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且 spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们采取跟 SpringBoot 版本号一致的版本:
- 1.5.x版本适用于Spring Boot 1.5.x
- 2.0.x版本适用于Spring Boot 2.0.x
- 2.1.x版本适用于Spring Boot 2.1.x
- …
项目中的依赖
1 | <dependencyManagement> |
SpringCloud Alibaba-Nacos 注册中心
参考文档:Nacos Discovery Example
Nacos 快速开始
Nacos是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。他是使用Java编写的,需要依赖Java环境。
下载nacos-server
https://github.com/alibaba/nacos/releases
启动nacos-server
- 双击bin中的startup.cmd文件
- 访问ip:8848/nacos/
- 使用默认的账号密码nacos/nacos进行登录
将服务注册到nacos中
1.首先,修改 pom.xml 文件,引入 Nacos Discovery Starter。
1
2
3
4<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>2.在应用的 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址。
1
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
这里配置在yml中也可以。
使用 @EnableDiscoveryClient 注解开启服务注册与发现功能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
class EchoController {
"/echo/{string}") (value =
public String echo(@PathVariable String string) {
return string;
}
}
}
启动应用,观察nacos服务列表
启动应用,观察nacos服务列表是否已经注册上服务。
注意:每一个应用都应该有名字,这样才能注册上去。修改application.properties文件
1 | spring.application.name=service-provoider |
同样的,可以把其他服务都注册到nacos中。
注册更多的服务上去,测试使用feign远程调用
Nacos使用三步
- 1.导包 nacos-discovery
- 2.写配置,指定nacos地址,指定应用的名字。
- 3.开启服务注册发现功能 @EnableDiscoveryClient。
Feign使用三步
- 1.导包openfeign
- 2.开启 @EnableFeignClients功能
- 3.编写接口,进行远程调用。
1
2"/coupon/coupon/member/list") (
public R membercoupons();
SpringCloud Alibaba-Nacos 配置中心
如何接入
- 1.首先,修改 pom.xml 文件,引入 Nacos Config Starter。
1
2
3
4<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency> - 2.在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据。
1
2spring.application.name=nacos-config-example
spring.cloud.nacos.config.server-addr=127.0.0.1:8848 - 3.完成上述两步后,应用会从 Nacos Config 中获取相应的配置,并添加在 Spring Environment 的 PropertySources 中。这里我们使用 @Value 注解来将对应的配置注入到 SampleController 的 userName 和 age 字段,并添加 @RefreshScope 打开动态刷新功能。
1
2
3
4
5
6
7
8
9
class SampleController {
"${user.name}") (
String userName;
"${user.age}") (
int age;
}
在nacos中配置
登录nacos控制台 → 配置服务 → 配置列表 → + 添加配置:
发布之后再次访问。
总结
SpringCloud Alibaba-Sentinel
SpringCloud Alibaba-Seata
SpringCloud Alibaba-OSS
SpringCloud
Feign声明式远程调用
简介
Fegin是一个声明式的HTTP客户端,它的目的就是让远程调用更加简单。Fegin提供了HTTP请求模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。
Fegin整合了Ribbon(负载均衡)和Hystrix(服务熔断),可以让我们不再需要显式地使用这两个组件。
SpringCloudFeign在NetflixFeign的基础上扩展了对SpringMVC注解的支持,在其实现下,我们只需要创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。简化了SpringCloudRibbon自行封装服务调用客户端的开发量。
使用
1.引入依赖
1
2
3
4<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>2.开启feign功能
1
"com.aiz.zhelimall.member.feign") (basePackages =
3.声明远程接口
1
2
3
4
5"zheli-coupon") (
public interface CouponFeignService {
"/coupon/coupon/member/list") (
public R memberCoupons();
}
GateWay
简介
网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。而spring cloud gateway作为SpringCloud官方推出的第二代网关框架,取代了Zuul网关。
网关提供API全托管服务,丰富的API管理功能,辅助企业管理大规模的API,以降低管理成本和安全风险,包括协议适配、协议转发。安全策略、防刷、流量、监控日志等功能。
Sprin Cloud GateWay旨在提供一种简单而有效的方式来对API进行路由,并为他们提供切面,例如:安全性,监控/指标和弹性等。
官方文档地址:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.3.RELEASE/reference/html/
核心概念
使用
- IDEA中创建项目
- 在IDEA中File->Module->Spring Initializr点进Next->…
- 导入依赖、开启服务注册发现功能、启动配置Nocas
- 断言(Predicate)
- 过滤器(Filter)
新建bootstrap.properties
文件。
在nacos中新建命名空间gateway。
在启动的时候排除数据源。
新建application.yml
配置网关
访问下面的地址,运行测试。
1 | http://localhost:88/hello?url=qq |