在项目重构过程中,从dubbo切换到spring cloud,soa架构到微服务。使用微服务架构,能够满足越来越复杂的业务发展,但也提高了系统复杂度。需要能够对整个系统进行监控,分析的工具。在重构过程中,将目光放到了网关层,但并没有找到比较满意的产品能提供对应的服务,有没有足够的人力物力和时间去开发一套这样的产品。机缘巧合下,发现了sia-gateway,当时眼前一亮,我所需要的东西,基本上里边都涵盖了,重要的是开源。在此感谢开发sia-gateway的攻城狮,开源项目绝对是人类的福音。
如果此篇博客在解决各位的现实问题的同时,也望大家不吝赐教,留下意见和建议,能够对此项目有一定的推广作用,扩大社区,不断地完善功能,以解决更多用户的问题
要部署一套完整的网关系统需要如下的组件:
msyql
redis
euraka server
EKK(elasticsearch + kibana + kafka)
mysql和redis的安装部署这里就不介绍了,网上有太多的资源。
使用springboot 构建euraka服务端,在pom文件中加入如下依赖:
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-eureka-server
org.springframework.boot
spring-boot-starter-tomcat
运行springboot工程,在浏览器中打开http://localhost:8100/,就可以看到euraka server的主页面
从网上下载安装包,修改配置文件,执行启动脚本,一般就可以完成安装部署。需要注意几个问题:
在完成基础环境的安装部署后,接下来可以进行网关的部署了。首先下载源码:https://github.com/siaorg/sia-gateway.git,在项目md文件,有关于项目的整体接受,如下图所示:
部署好后,使用admin登录系统,进入DeskTop页,选择网关组。可看到首页网关统计数据。
配置路由转发规则,可根据指导进行路由配置。
日志管理实际上是使用iframe嵌入了kibana的页面,跟直接打开kibana页面的效果相同。只是在页面打开的时候,去判断了网管组是否在es中创建索引,没有的话,向kibana发送创建网关组索引的命令。
创建索引实际上可在kibana页面上完成,此外在代码逻辑上还有点问题,稍微做了修改。
sia-gateway-admin模块,SettingController类修改如下:
码云下载地址:https://gitee.com/micheal.com/money-parent.git
dev分支
├── money-parent
│ ├── money-app 启动组件:包括启动类,配置文件,controller
│ ├── money-core 基础能力组件:包括提供基础功能的类(如util),核心包
│ ├── money-domain 数据持久层
│ ├── money-service-api 服务api
│ ├── money-service-provider 服务提供者,业务模块
注意事项:
@FeignClient(name = ServiceApiName.API_NAME, path = ServiceApiName.API_NAME, fallback = BaseHystrix.class)
public interface BaseService {
@RequestMapping(value = "/queryUser", method = RequestMethod.POST)
UserResp queryUser(@Valid UserReqeust request);
}
sia-gateway集成了EKK,作为日志组件,也可以集成到我们自己的项目中,提供非常方便的日志收集,查询的功能。
<dependency>
<groupId>com.sia</groupId>
<artifactId>sia-gateway-messaging</artifactId>
<version>1.0</version>
</dependency>
<appender name="KAFKA" class="com.creditease.gateway.message.appender.SagMqAppender"></appender>
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="KAFKA"/>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="ASYNC"/>
</root>
########################################################
### KAFKA 基本配置
########################################################
spring.kafka.bootstrap-servers= localhost:9092
# 生产者和消费者topic前缀
spring.kafka.topicPrefix= sag.
spring.kafka.producer.numOfPartition= 1
spring.kafka.producer.retries= 2
# 每次批量发送消息的数量
spring.kafka.producer.batch-size= 16384
spring.kafka.producer.buffer-memory= 33554432
@SpringBootApplication(scanBasePackages = {"com.cdzg.cloud", "com.creditease.gateway"})
@EnableSagProducer
public class Application {
@PostConstruct
void started() {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
}
public static void main(String[] args) {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
SpringApplication.run(Application.class, args);
}
}
如此,就完成了sia消息组件的集成,系统打印到控制台和日志文件的日志记录,会发送给kafka,然后消费者将日志存储到es中。如果要在kibana中方便的查询日志,还需要为该类型的日志创建索引。