GO微服务框架

goms:GO微服务框架

说明:
本项目是由个人开发的微服务基础框架,项目正在积极开发中,很期待得到你的star。

特性:
1、服务注册发现
2、网关路由分发
3、负载均衡策略
4、服务调用安全
5、服务重试策略
6、分布式链路追踪
7、可选组件Rabbitmq、Elasticsearch
8、支持Gin等Web框架

准备工作:
1、Etcd,Docker启动:

docker run --rm -it -d --name etcd -p 2379:2379 -e "ALLOW_NONE_AUTHENTICATION=yes" -e "ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379" bitnami/etcd

2、Zipkin,Docker启动:
docker run --rm -it -d --name zipkin -p 9411:9411 openzipkin/zipkin

3、示例程序依赖redis数据库,Docker启动:

docker run --rm -it -d --name redis -p 6379:6379 redis

文档

一、配置文件

路径:configs目录
projectName:所有服务所属项目名称,非微服务节点名称
callServiceKey: 服务调用安全验证key
etcdAddr: etcd地址,集群可多行填写
zipkinAddr: zipkin地址
redisAddr: redis地址
esAddr: elasticsearch地址
amqpAddr: rabbitmq地址

services:服务节点路由配置

配置示例:

projectName: "goms"
callServiceKey: "goms by panco"
etcdAddr:
  - "192.168.125.181:2379"
zipkinAddr: "http://192.168.125.183:9411/api/v2/spans"

services:
  user:
    register: "/register"
    login: "/login"
  order:
    submit: "/order/submit"

二、Gateway API网关

启动:go run example/gateway/main.go
参数:
-http_port:http监听端口
-rpc_port:rpc监听端口

说明:gateway是网关节点,接受所有客户端请求,然后内部会根据请求的url转发到配置好的service路由,多个gateway节点需要使用nginx等前端配置负载均衡转发请求

模拟三个Gateway网关节点进行集群架设:

go run example/gateway/main.go -http_port 8080 -rpc_port 8180
go run example/gateway/main.go -http_port 8081 -rpc_port 8181
go run example/gateway/main.go -http_port 8082 -rpc_port 8182

观察我们第一个gateway节点打印如下:

2021/08/10 11:08:01 [gateway] Http Listen on port: 8080
2021/08/10 11:08:14 [gateway] node [192.168.125.179:8181_192.168.125.179:8081] join
2021/08/10 11:08:23 [gateway] node [192.168.125.179:8182_192.168.125.179:8082] join

表示gateway节点互相能够发现其他节点服务启动


三、Service服务

启动服务节点:
go run example/services/user/main.go
参数:
-rpc_port:rpc监听端口
-etcd_addr:etcd服务地址(支持集群格式:127.0.0.1:2379|127.0.0.1:2380

说明:service服务不需要使用nginx等前端转发,会由gateway进行转发到service
模拟三个user服务节点进行集群架设:

go run example/services/user/main.go -http_port 9080 -rpc_port 9180
go run example/services/user/main.go -http_port 9081 -rpc_port 9181
go run example/services/user/main.go -http_port 9082 -rpc_port 9182

观察我们第一个node节点打印如下:

2021/08/10 11:10:46 [user] Http Listen on port: 9080
2021/08/10 11:10:54 [user] node [192.168.125.179:9181_192.168.125.179:9081] join
2021/08/10 11:11:02 [user] node [192.168.125.179:9182_192.168.125.179:9082] join

另外我们再看一下第一个gateway打印的所有信息:

2021/08/10 11:08:01 [gateway] Http Listen on port: 8080
2021/08/10 11:08:14 [gateway] node [192.168.125.179:8181_192.168.125.179:8081] join
2021/08/10 11:08:23 [gateway] node [192.168.125.179:8182_192.168.125.179:8082] join
2021/08/10 11:10:46 [user] node [192.168.125.179:9180_192.168.125.179:9080] join
2021/08/10 11:10:54 [user] node [192.168.125.179:9181_192.168.125.179:9081] join
2021/08/10 11:11:02 [user] node [192.168.125.179:9182_192.168.125.179:9082] join

现在我们随意关闭一个节点,查看其他所有节点打印信息:
2021/08/10 11:13:23 [user] node [192.168.125.179:9180_192.168.125.179:9080] leave
每个服务节点不仅可以监听新节点的加入(join),还能监听节点的离开(leave)

我们可以总结一下:任意服务的任意节点互相能够发现其他任意服务的任意节点
这就是基于etcd实现的服务注册发现模型:
我们可以去看看etcd存储的数据:
etcdctl get --prefix goms
(小提示:Docker启动的etcd需要进入etcd容器查看)
docker container exec -ti [容器id] bash
打印如下:

goms_gateway_192.168.125.179:8180_192.168.125.179:8080
0
goms_gateway_192.168.125.179:8181_192.168.125.179:8081
0
goms_gateway_192.168.125.179:8182_192.168.125.179:8082
0
goms_user_192.168.125.179:9181_192.168.125.179:9081
0
goms_user_192.168.125.179:9182_192.168.125.179:9082
0

可以看出,我们刚刚启动的所以服务节点都在etcd里面以goms_前缀存储,后面跟着服务名称,然后是两个服务地址,前面的是RPC监听地址,后面的是HTTP监听地址

四、访问API网关

1、集群服务状态查看:
打开浏览器,输入gateway任一节点http地址,后面加上/cluster: http://127.0.0.1:8082/cluster

{
    "services": {
        "gateway": {
            "PollNext": 0,
            "Nodes": [
                "192.168.125.179:8180_192.168.125.179:8080",
                "192.168.125.179:8181_192.168.125.179:8081",
                "192.168.125.179:8182_192.168.125.179:8082"
            ],
            "RequestFinish": 0
        },
        "user": {
            "PollNext": 0,
            "Nodes": [
                "192.168.125.179:9180_192.168.125.179:9080",
                "192.168.125.179:9181_192.168.125.179:9081",
                "192.168.125.179:9182_192.168.125.179:9082"
            ],
            "RequestFinish": 0
        }
    },
    "status": true
}

可以看到当前整个微服务的所有服务所有节点的信息,PollNext是负载均衡轮询策略索引,Nodes就是当前在线服务集群列表,RequestFinish是当前服务集群一共处理的请求数。

2、打开postman,选择GET/POST请求方式,URL输入gateway任一节点http地址,然后加上访问用户服务的路由(config/services.yml)如: http://192.168.125.179:8081/api/user/login?a=1&b=3 ,可增加任意请求头、body等,最后gateway会带上原始请求报文和链路跟踪相关参数请求下游服务:

{
    "code": 0,
    "data": {
        "body": {
            "password": "test",
            "username": "test"
        },
        "headers": {
            "Accept": "*/*",
            "Accept-Encoding": "gzip, deflate, br",
            "Connection": "keep-alive",
            "Content-Length": "37",
            "Content-Type": "application/json",
            "Postman-Token": "85d0aef3-4f06-4887-9ec8-0531c09d209c",
            "User-Agent": "PostmanRuntime/7.28.4"
        },
        "method": "POST",
        "urlParam": "?a=1&b=3"
    },
    "msg": "success",
    "status": true
}

3、再看集群服务状态

{
    "services": {
        "gateway": {
            "PollNext": 0,
            "Nodes": [
                "192.168.125.179:8180_192.168.125.179:8080",
                "192.168.125.179:8181_192.168.125.179:8081",
                "192.168.125.179:8182_192.168.125.179:8082"
            ],
            "RequestFinish": 0
        },
        "user": {
            "PollNext": 1,
            "Nodes": [
                "192.168.125.179:9180_192.168.125.179:9080",
                "192.168.125.179:9181_192.168.125.179:9081",
                "192.168.125.179:9182_192.168.125.179:9082"
            ],
            "RequestFinish": 1
        }
    },
    "status": true
}

可以看到user集群的的PollNext已经变成1,表示下一个请求将由第二个Node来处理请求。多请求几次看看!切换user服务的控制台显示日志打印信息,会看到三个user服务依次轮流收到请求

五、查看opentracing分布式链路跟踪日志:

1、浏览器登录zipkin http://127.0.0.1:9411
2、点击run query,可以查询到刚刚请求的整个链路耗时情况和请求报文 2、关于opentracing请查阅相关文档,本项目集成的是zipkin

Owner
Panco
wechat:freePan_1995 qq:1129443982
Panco
Similar Resources
GO微服务框架

Go Garden Go Garden是一款面向分布式系统架构的微服务框架 概念 Go Garden为分布式系统架构的开发提供了核心需求,包括微服务的基础架构支持,例如gateway网关模块做路由分发支持,服务调用链路追踪的集成。 特性 服务注册发现 网关路由分发 负载均衡 动态配置 安全认证 服务

Dec 19, 2022