sia-gateway微服务网关实践

2023-11-03 02:21
文章标签 服务 实践 网关 gateway sia

本文主要是介绍sia-gateway微服务网关实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

springcloud + sia-gateway实战

  • 编写目的
  • 环境安装和配置
    • euraka server
    • EKK安装部署
  • sia-gateway部署
    • 核心模块介绍
    • 模块部署
  • 网关配置
    • 路由配置
    • 日志组件配置
  • springcloud工程模板
    • 项目介绍
    • 网关日志组件集成

编写目的

在项目重构过程中,从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安装部署

从网上下载安装包,修改配置文件,执行启动脚本,一般就可以完成安装部署。需要注意几个问题:

  1. 版本问题,kibana、elasticsearch,工程使用的jar包的主版本号必须要一致,否则会导致无法连接的问题,不通主版本间内部协议可能不一致,导致功能无法正常使用,我使用的是5.6.16版本。
  2. 配置文件问题,elasticsearch和kibana绑定的host,要绑定IP地址,不要用localhost或127.0.0.1,否则会导致外部环境无法访问的问题
  3. elasticsearch账户问题,es不能使用root账户启动,需要新建账户,并为账户分配目录权限
    注意上述事项后,基本上能够顺利完成安装。
  4. elasticsearch配置中有网络端口(network.port)和数据端口(transport.tcp.port),网络端口用于前端访问或数据查询,数据端口节点间通信。kibana配置的是网络端口,api包需要配置数据端口。

sia-gateway部署

在完成基础环境的安装部署后,接下来可以进行网关的部署了。首先下载源码:https://github.com/siaorg/sia-gateway.git,在项目md文件,有关于项目的整体接受,如下图所示:
网关模块功能和关系

核心模块介绍

  1. 项目最核心的模块为 sia-gateway-core,core模块集成了zuul网关,路由转发是通过此模块完成
  2. sia-gateway-admin 是前端工程的服务端主键,前端工程的配置,展示等内容,是由此模块提供服务的
  3. 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
dev分支

项目介绍

  • 使用feign进行服务调度
  • hystrix熔断机制
  • 集成sia网关日志组件

├── money-parent
│ ├── money-app 启动组件:包括启动类,配置文件,controller
│ ├── money-core 基础能力组件:包括提供基础功能的类(如util),核心包
│ ├── money-domain 数据持久层
│ ├── money-service-api 服务api
│ ├── money-service-provider 服务提供者,业务模块

注意事项:

  1. server.servlet.context-path= /xxx 配置文件此项需要配置,作为网关转发的规则依据,不然网关无法集成swagger,这也是我放弃使用webflux的原因之一
  2. api接口使用feign配置,所有相比普通接口,此处的接口内容增加了服务发现的地址
@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);
}
  1. api的接口,在@FeignClient注解path参数,配置统一工程名(及系统context-path)参数,否则feign通过接口找服务的时候,url会少一层目录,无法找到服务

网关日志组件集成

sia-gateway集成了EKK,作为日志组件,也可以集成到我们自己的项目中,提供非常方便的日志收集,查询的功能。

  • pom.xml添加依赖的jar包
 <dependency><groupId>com.sia</groupId><artifactId>sia-gateway-messaging</artifactId><version>1.0</version>
</dependency>
  • 配置logback-spring.xml文件,在logback中加入kafka的日志组件
<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的配置
########################################################
### 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
  • 启动类中,加入massage组件的配置路径,和生产者的注解
@SpringBootApplication(scanBasePackages = {"com.cdzg.cloud", "com.creditease.gateway"})
@EnableSagProducer
public class Application {@PostConstructvoid 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中方便的查询日志,还需要为该类型的日志创建索引。
创建索引

这篇关于sia-gateway微服务网关实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/334922

相关文章

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

nacos服务无法注册到nacos服务中心问题及解决

《nacos服务无法注册到nacos服务中心问题及解决》本文详细描述了在Linux服务器上使用Tomcat启动Java程序时,服务无法注册到Nacos的排查过程,通过一系列排查步骤,发现问题出在Tom... 目录简介依赖异常情况排查断点调试原因解决NacosRegisterOnWar结果总结简介1、程序在

MySQL存储过程实践(in、out、inout)

《MySQL存储过程实践(in、out、inout)》文章介绍了数据库中的存储过程,包括其定义、优缺点、性能调校与撰写,以及创建和调用方法,还详细说明了存储过程的参数类型,包括IN、OUT和INOUT... 目录简述存储过程存储过程的优缺点优点缺点存储过程的创建和调用mysql 存储过程中的关键语法案例存储

Java 的ArrayList集合底层实现与最佳实践

《Java的ArrayList集合底层实现与最佳实践》本文主要介绍了Java的ArrayList集合类的核心概念、底层实现、关键成员变量、初始化机制、容量演变、扩容机制、性能分析、核心方法源码解析、... 目录1. 核心概念与底层实现1.1 ArrayList 的本质1.1.1 底层数据结构JDK 1.7

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S

springboot依靠security实现digest认证的实践

《springboot依靠security实现digest认证的实践》HTTP摘要认证通过加密参数(如nonce、response)验证身份,避免明文传输,但存在密码存储风险,相比基本认证更安全,却因... 目录概述参数Demopom.XML依赖Digest1Application.JavaMyPasswo