前言
最近笔者在对微服务架构进行学习,参考了各种项目的技术文章、框架文档以及视频网站,最终选择使用Nacos+Dubbo+Gateway+Sentinel来搭建一个项目练手。其中Nacos作为服务的注册发现中心兼配置中心,Dubbo作为RPC通讯框架来实现服务间的接口调用,而Gateway则作为网关,进行客户端请求的转发,熔断服务则使用Sentinel框架。后续会加入ElasticSearch+SpringSession,进行数据的缓存分级,链路追踪则使用Sleuth,其中还会组合分布式事务框架Seata,有兴趣的朋友可以关注一下,项目地址:https://github.com/peachl/cloud-demo/tree/master#readme,长期更新。
集成Gateway网关
回顾项目上次以及集成了Nacos、Dubbo等框架,现在需要在原有项目上进行集成Gateway的操作,还未配置对应的Nacos、Dubbo的朋友可以回顾一下《微服务初体验(一):整合Nacos进行服务注册和项目初始化》、《微服务初体验(二):使用Nacos作为配置中心并集成Dubbo》之前的内容。
之前的项目中已经集成了Gateway这个模块,现在只需要修改Gateway模块对应的Maven依赖和对应的yaml路由转发规则即可。首先打开对应的pom.xml删除其中的多余web依赖,然后引入如下依赖:
<!-- 公共依赖模块-->
<dependency>
<groupId>org.example</groupId>
<artifactId>cloud-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- Gateway网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.4.RELEASE</version>
</dependency>
<!-- nacos注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
开始编写Gateway对应的路由配置,打开cloud-gateway模块下的application.yml配置文件,编写下列规则:
server:
port: 80
spring:
application:
name: gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
routes:
- id: consumer_route
#uri后面指定消费者的服务id
uri: lb://consumer
predicates:
#匹配条件
- Path=/**
重启项目,然后通过访问80通过网关转发请求至consumer模块的Controller中,可以看到下图访问的是80端口但是请求已经被转发至8011端口的consumer服务上了,至此Gateway网关集成完毕。
集成Sentinel进行限流
Sentinel是阿里推出的一个分布式系统的流量管控框架,可以很好的对流量进行削峰降级、负载均衡之类的管控,首先在common模块中引入相关依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
引入依赖完毕后去github上下载对应的jar,记得要选择对应的版本,笔者这里的对应的版本是1.7.1
下载完毕之后使用java -jar命令启动
配置对应yml文件
spring:
cloud:
sentinel:
transport:
#本机Sentinel的控制台地址
dashboard: localhost:8080
#当前服务和Sentinel通讯的端口
port: 8719
由于Sentinel是懒加载,所以在请求完该接口后才会出现对应的数据,所以现在直接访问会出现Sentinel控制台内容为空的情况,多刷新几次请求接口即可显示对应的接口数据
以上Nacos整合Gateway、Sentinel等框架已完成,框架中具体的配置和复杂实现还是要根据项目实际情况去配置,在此只是简单的搭建出对应Demo。
路漫漫其修远兮,吾将上下而求索