springcloud + sia-gateway实战
springcloud + sia-gateway实战
编写目的
在项目重构过程中,从dubbo切换到spring cloud,soa架构到微服务。使用微服务架构,能够满足越来越复杂的业务发展,但也提高了系统复杂度。需要能够对整个系统进行监控,分析的工具。在重构过程中,将目光放到了网关层,但并没有找到比较满意的产品能提供对应的服务,有没有足够的人力物力和时间去开发一套这样的产品。机缘巧合下,发现了sia-gateway,当时眼前一亮,我所需要的东西,基本上里边都涵盖了,重要的是开源。在此感谢开发sia-gateway的攻城狮,开源项目绝对是人类的福音。
如果此篇博客在解决各位的现实问题的同时,也望大家不吝赐教,留下意见和建议,能够对此项目有一定的推广作用,扩大社区,不断地完善功能,以解决更多用户的问题
环境安装和配置
要部署一套完整的网关系统需要如下的组件:
msyql
redis
euraka server
EKK(elasticsearch + kibana + kafka)
mysql和redis的安装部署这里就不介绍了,网上有太多的资源。
euraka server
使用springboot 构建euraka服务端,在pom文件中加入如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--<scope>provided</scope>-->
</dependency>
运行springboot工程,在浏览器中打开http://localhost:8100/,就可以看到euraka server的主页面
EKK安装部署
从网上下载安装包,修改配置文件,执行启动脚本,一般就可以完成安装部署。需要注意几个问题:
- 版本问题,kibana、elasticsearch,工程使用的jar包的主版本号必须要一致,否则会导致无法连接的问题,不通主版本间内部协议可能不一致,导致功能无法正常使用,我使用的是5.6.16版本。
- 配置文件问题,elasticsearch和kibana绑定的host,要绑定IP地址,不要用localhost或127.0.0.1,否则会导致外部环境无法访问的问题
- elasticsearch账户问题,es不能使用root账户启动,需要新建账户,并为账户分配目录权限
注意上述事项后,基本上能够顺利完成安装。
sia-gateway部署
在完成基础环境的安装部署后,接下来可以进行网关的部署了。首先下载源码:https://github.com/siaorg/sia-gateway.git,在项目md文件,有关于项目的整体接受,如下图所示:
核心模块介绍
- 项目最核心的模块为 sia-gateway-core,core模块集成了zuul网关,路由转发是通过此模块完成
- sia-gateway-admin 是前端工程的服务端主键,前端工程的配置,展示等内容,是由此模块提供服务的
-
sia-gateway-admin-display 为前端组件,需要使用nodejs进行编译
这3个模块,网关的基本功能已经具备了,可完成网关的配置、转发功能。
模块部署
- 数据库安装,将sia-gateway-admin模块,resource/db目录下的sql脚本导入到数据库中
- 后端工程部署,需要部署的模块为:sia-gateway-admin,sia-gateway-synchspeed,sia-gateway-stream,sia-gateway-service,sia-gateway-monitor,sia-gateway-core。修改配置文件,将application.yml文件的配置项,修改为前面安装的基础环境的配置,打包运行
- 前端工程部署,修改sia-gateway-admin-display模块目录下 config/dev.env.js文件,CESHI_API_HOST项为sia-gateway-admin的地址,CESHI_API_HOST_LOG项是kibana的地址,完成修改后使用nodejs编译运行,npm install 编译, npm run dev运行
部署好后,使用admin登录系统,进入DeskTop页,选择网关组。可看到首页网关统计数据。
网关配置
路由配置
配置路由转发规则,可根据指导进行路由配置。
- 网关集群组名为DeskTop页选择的网关组
- 匹配路径配置路由匹配规则
- 后端服务ID是注册到euraka的服务名称,后端服务URL是转发到的URL地址,ListofServer是服务名称和URL的组合方式
- 前缀生效是路由转发前去掉配置规则的头,前缀不生效是转发整个URL
日志组件配置
日志管理实际上是使用iframe嵌入了kibana的页面,跟直接打开kibana页面的效果相同。只是在页面打开的时候,去判断了网管组是否在es中创建索引,没有的话,向kibana发送创建网关组索引的命令。
创建索引实际上可在kibana页面上完成,此外在代码逻辑上还有点问题,稍微做了修改。
sia-gateway-admin模块,SettingController类修改如下:
springcloud工程模板
码云下载地址:https://gitee.com/micheal.com/money-parent.git
- 使用feign进行服务调度
- hystrix熔断机制
- 集成sia网关日志组件
├── money-parent
│ ├── money-app 启动组件:包括启动类,配置文件,controller
│ ├── money-core 基础能力组件:包括提供基础功能的类(如util),核心包
│ ├── money-domain 数据持久层
│ ├── money-service-api 服务api
│ ├── money-service-provider 服务提供者,业务模块
注意事项:
- server.servlet.context-path= /xxx 配置文件此项需要配置,作为网关转发的规则依据,不然网关无法集成swagger,这也是我放弃使用webflux的原因之一
- api接口使用feign配置,所有相比普通接口,此处的几口内容增加了服务发现的地址
@FeignClient(name = ServiceApiName.API_NAME, fallback = BaseHystrix.class)
public interface BaseService {
@RequestMapping(value = ServiceApiName.CONTEXT_PATH + "/queryUser", method = RequestMethod.POST)
UserResp queryUser(@Valid UserReqeust request);
}
- api的接口,在provider的接口地址的路径前,还行加上context-path配置的路径,否则无法找到服务