公司做项目重构,从单体换成微服务,没有做过网关相关开发的我接下了这个工作.
现在关于shenyu(原soul)的文章、教程都比较少,所以记录一下整合nacos的过程,希望能够对你有帮助
架构
-
shenyu-admin : 插件和其他信息配置的管理后台
-
shenyu-bootstrap : 用于启动项目,用户可以参考
-
shenyu-client : 用户可以使用 Spring MVC,Dubbo,Spring Cloud 快速访问
-
shenyu-disruptor : 基于disruptor的封装
-
shenyu-register-center : shenyu-client提供各种rpc接入注册中心的支持
-
shenyu-common : 框架的通用类
-
shenyu-dist : 构建项目
-
shenyu-metrics : prometheus(普罗米修斯)实现的 metrics
-
shenyu-plugin : ShenYu 支持的插件集合
-
shenyu-spi : 定义 ShenYu spi
-
shenyu-spring-boot-starter : 支持 spring boot starter
-
shenyu-sync-data-center : 提供 ZooKeeper,HTTP,WebSocket,Nacos 的方式同步数据
-
shenyu-examples : RPC 示例项目
-
shenyu-web : 包括插件、请求路由和转发等的核心处理包
本文目标
我在做前期准备工作的时候,最关心的问题是如何接入nacos.如果想要搞清这个问题就需要知道具体哪里用到了nacos,起到了什么作用.
根据我的理解,用到nacos的地方一共有两处,一处是数据同步,一处是Spring cloud服务接入网关
数据同步
数据同步就是架构图中的Sync Data.是指在 shenyu-admin
后台操作数据以后,使用何种策略将数据同步到 Apache ShenYu
网关.这里的数据包括插件、选择器、规则数据、元数据、签名数据等.
在使用nacos的情况下,nacos的配置中心会包含全量数据.当用户在 shenyu-admin
更新了数据,会首先更新到数据库,然后去 全量 更新 nacos 在配置中心的数据. Apache ShenYu
网关会监听nacos,一旦有信息变更,则更新本地缓存
Spring cloud 服务接入网关
Spring cloud 服务接入网关 就是架构图中的Plugins.
我的理解就是这部分作用就是 拉取nacos的注册信息,把服务名称转换成IP+端口
版本信息
Nacos : 2.0.3
Apache ShenYu : 2.4.3
准备工作
- mysql
- https://github.com/apache/incubator-shenyu/tree/master/db/init/mysql
- 下载mysql的初始化脚本,并执行
- nacos
- 如果你是docker部署,需要映射两个端口 一个8848 一个9848
- 下载源码
- https://github.com/apache/incubator-shenyu
- clone项目,导入到idea,切换到
2.4.3-release
分支
- 测试项目(相当于业务服务)
- 搭建一个能注册进nacos的项目
- 添加一个controller以供测试
整合 nacos
先看源码目录,当前需要重点关注的两个模块分别是shenyu-amdin
和 shenyu-bootstrap
.
shenyu-amdin
就是 网关管理系统shenyu-bootstrap
就是 网关的启动入口
Spring cloud 服务接入网关
-
这一步的目标就是一个请求请求到网关上之后,网关按照路由规则,成功转发到业务服务上.
首先把关注点放到shenyu-amdin
模块,打开shenyu-amdin
模块的application.yml
. -
把
spring.profiles.atcive
改成mysql
spring:
profiles:
active: mysql
-
打开
application-mysql.yml
把mysql的连接信息改成你的mysql信息 -
然后把关注点放到
shenyu-bootstrap
模块,打开shenyu-bootstrap
模块的application.yml
. -
把eureka相关配置注掉,然后把
spring.cloud.discovery.enabled
和spring.cloud.nacos.discovery.enabled
设为true,并配置nacos的相关信息
spring:
main:
allow-bean-definition-overriding: true
application:
name: shenyu-bootstrap
codec:
max-in-memory-size: 2MB
cloud:
loadbalancer:
ribbon:
enabled: false
discovery:
enabled: true
nacos:
discovery:
server-addr: 127.0.0.1:8848 # Spring Cloud Alibaba Dubbo use this.
enabled: true
namespace: 2dfdefa9-1ddb-482d-84ee-41bffc4d10ea
#eureka:
# client:
# enabled: false
# serviceUrl:
# defaultZone: http://localhost:8761/eureka/
# instance:
# prefer-ip-address: true
-
启动
shenyu-bootstrap
、shenyu-amdin
和 测试项目 -
登陆 网关管理系统
- 地址: http://
shenyu-amdin
的 IP :9095/ - 🌰:http://127.0.0.1:9095/
- 用户名: admin
- 密码: 123456
- 地址: http://
-
打开插件管理,找到Spring cloud ,设为开启
-
新增元数据
- 元数据的作用就是指定某一路径前缀使用什么插件
- 也就是说service1为前缀的请求都会被Springcloud插件处理
-
新增选择器及规则
-
选择器的serviceId对应的就是你的业务服务的service name,是网关能够正确找到你服务的关键
-
-
-
-
-
新增ContextPath
-
ContextPath的规则里的contextPath能够去掉你的路径前缀
-
-
-
-
请求测试接口
- URL: http://网关地址:ip/路径前缀/接口地址
- 我的URL则是: http://127.0.0.1:9195/service1/echo/a
数据同步
-
找到
shenyu-bootstrap
模块的application.yml
,注掉sync
下的websocket
,打开nacos
相关的配置,并修改 -
打开
shenyu-amdin
模块的application.yml
,做同样的操作 -
在
shenyu-bootstrap
模块的pom中添加依赖
<!-- apache shenyu data sync start use nacos-->
<dependency>
<groupId>org.apache.shenyu</groupId>
<artifactId>shenyu-spring-boot-starter-sync-data-nacos</artifactId>
<version>${project.version}</version>
</dependency>
-
启动
shenyu-bootstrap
、shenyu-amdin
和 测试项目 -
如果配置中心出现了下面四个文件,则说明
shenyu-amdin
接入成功 -
请求测试接口
- URL: http://网关地址:ip/路径前缀/接口地址
相关文档
部署先决条件: https://shenyu.apache.org/zh/docs/deployment/deployment-before
本地部署: https://shenyu.apache.org/zh/docs/deployment/deployment-local
Spring Cloud服务接入: https://shenyu.apache.org/zh/docs/user-guide/spring-cloud-proxy
数据同步: https://shenyu.apache.org/zh/docs/user-guide/use-data-sync
数据同步原理: https://shenyu.apache.org/zh/docs/design/data-sync
🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹
🌹 ❗️您的 赞 👍 、收藏 🌟 、关注➕ 是我最大的动力❗️ 🌹
🌹 如果您对文章有任何意见或建议,欢迎在 评论区 、私信 留言 🌹
🌹 或通过我的邮箱联系到我 🌹
🌹 📮 wangleshan1997@gmail.com 📮 🌹
🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹