服务注册与发现用mysql_yeasul: 轻量级服务注册与发现中心,具有健康检查功能。...

Yeasul是亿联定制版的服务注册与发现中心,采用Java和Spring Boot开发,依赖MySQL 8.0。它具有心跳检测功能,确保服务健康,并通过集群共享数据库实现数据一致性。项目支持服务注册、健康检查、服务注销等功能,并提供Spring Boot服务注册及HTTP接口注册方式。
摘要由CSDN通过智能技术生成

yeasul

亿联定制版服务注册与发现中心,具备心跳检测功能,由于接口参考了consul,所以取名为yeasul。

项目架构

使用Java语言开发,依赖于MySQL 8.0数据库,基于Spring Boot 2.1.6开发。Yeasul会将服务信息持久化到数据库,并在每次重新启动Yeasul时,会重新开启对服务的健康检查。在集群情况下,集群中的每个Yeasul连接的是同一个数据库,即一个集群将会共同连接一个数据库,从而保证了数据的一致性。这与consul的每个consul拥有各自独立的数据持久化存储不同。当然也可以对MySQL数据库作主从配置,防止数据库宕机。

数据库模型

注册进Yeasul的所有信息将会被持久化进数据库,如下为数据库的模型图。

MYSQL_ENTITIES.bmp

node表

用于记录集群中的节点信息

node_id:节点ID,在启动一个节点时,会分配一个UUID

name:节点名称,在启动前application.yml中配置,名称不允许有重复

address:节点IP地址

datacenter:数据中心名称

check表

node:负责此检查的节点名

check_id:检查的id,默认格式为service:服务实例ID

name:检查的名称,默认格式为Service '服务名称' check

status:三个值,passing,warning,failing,分别代表通过,警告和失败,实际上只用到了passing和failing。

notes:检查的备注

output:每次执行完一次检查后,将会更新output的值,比如HTTP GET http://127.0.0.1:8500 200 OK Output:Apollo

service_id:检查的服务ID

service:检查的服务的名称

check_info表

此表用于持久化检查的信息,用于在每次yeasul重启时,能够继续执行原有的检查

check_id:检查的id,默认格式为service:服务实例ID

kind:检查的方式,http,tcp

interval:定义间隔多久执行一次检查,例如5s表示每隔5秒执行一次检查,支持的单位有ns,us,ms,s,m,h(纳秒,微妙,毫秒,秒,分,时)

timeout:定义检查的超时时间,格式与interval相同。若超出超时时间没有得到正确的相应,则会将check表中的对应的check_id的记录的status置为failing。反之为passing。

node:负责执行此检查的节点名称

service_name表

此表用于记录注册在数据库中所有的服务名称

service:服务名称

service_instance表

用于记录注册的服务实例信息

service_instance_id:服务实例ID

service:服务名称

address:服务的IP地址

port:服务的端口号

service_tag

用于记录服务实例的标签信息。注意:如果一个服务实例有两个标签A和B,那么将会在此表内产生两条记录。并不是将A和B放在同一记录内

service:服务名称

value:标签值

service_id:服务实例ID

register_info

用于记录哪个服务是注册在哪个节点上的,以及位于哪个数据中心

service_instance_id:服务实例ID

node_id:节点ID,服务注册在此节点上

datacenter:数据中心名称。服务位于此数据中心

service:服务名称

key_value表

存储key/value

datacenter:数据中心名称,表示此kv存储于此数据中心

key:key值,xxx/xxx表示值,xxx/xxx/表示目录

value:value值

上手指南

帮助你在本地机器上安装和运行该项目,进行开发和测试。关于如何将该项目部署到在线环境,请参考部署小节。

环境要求

JDK 1.8.0_144

MySQL 8.0

环境配置

数据库配置

创建名为consul_schema的数据库,并使用consul-server-8500模块下的consul_schema.sql创建表。

application.yml配置

server:

port: 8500#设置服务端端口号

spring:

datasource:

username: root#数据库账户

password: 123456#数据库密码

url: jdbc:mysql://62.234.44.124:3306/consul_schema#数据库url

driver-class-name: com.mysql.cj.jdbc.Driver

http:

converters:

preferred-json-mapper: gson #必须使用gson,否则健康检查会出错,必须!

mybatis:

mapper-locations: classpath:/mappers/*.xml

type-aliases-package: com.yealink.entities

configuration:

map-underscore-to-camel-case: true

consul:

debug-config:

bind-address: 10.83.2.93#设置本服务端IP地址,必要

config:

node-name: myNode1#设置节点名,必要,且节点名唯一

datacenter: CN_DC1 #设置数据中心名,要加入同一集群,需设置相同的数据中心名,必要

快速开始

经过上面的环境搭建,并可以运行yeasul了。

使用浏览器访问,127.0.0.1:8500,如果正常进入如下页面,就表示你已经可以开始使用yeasul了。

a6db7bc5d03a0179bf19461301d65d4b.bmp

如何注册服务?

有两个注册方式,如果是Spring Boot项目,可以通过配置application.yml的方式进行注册。也可以通过PUT请求向/v1/agent/service/register发送带有服务相关信息的JSON数据进行注册。

Spring Boot服务注册

需要在pom中引入spring-cloud-starter-consul-discovery和spring-boot-starter-actuator。

并在application.yml中进行如下配置:

spring:

application:

name: dept-provider-8001#服务名

cloud:

consul:

host: 10.83.2.93#yeasul的IP地址

port: 8500#yeasul的端口号

discovery:

service-name: dept-provider #注册进yeasul的服务名称

ip-address: 10.83.2.93 #此服务的ip地址

tags: ["version=1.0","author=Happy-xjb"] #服务标签

prefer-ip-address: true#以IP地址的形式注册,而不是主机名

register-health-check: true#如果注册服务时同时注册HTTP健康检查,则置true,并填写下方所有参数。如果不需要注册健康检查,则不要填写下方所有参数。

health-check-path: /actuator/health #健康检查的URL

health-check-interval: 5s #每隔5s执行一次检查

health-check-timeout: 5s#超时时间

如果需要自定义健康检查地址,请暴露自定义的接口,接口返回类型为org.springframework.boot.actuate.health.Health。

接口方式注册

请求URL

PUT/v1/agent/service/register

请求示例

{

"ID":"redis1",//服务实例ID

"Name":"redis",//服务名称

"Tags":[//服务标签

"primary",

"v1"

],

"Address":"127.0.0.1",//服务IP地址

"Port":8000,//服务的端口号

"Check":{//如果注册时需要注册健康检查,按如下填写,HTTP和TCP字段二选一,Interval和Timeout必要。

"HTTP":"http://localhost:5000/health",

"TCP":"127.0.0.1:8500",

"Interval":"10s",

"Timeout":"15s"

}

}

通过以上两种方式注册后,如果在页面或者数据库中成功显示了新注册的服务,那么就表示服务注册成功了!

如何注销服务?

有两种方式,一是在页面中的NODES模块下找到相应的服务进行注销,非常简单。二是通过HTTP接口进行注销。下面介绍第二种方式。

请求URL

PUT/v1/agent/service/deregister/{serviceId}

查看当前节点信息

Self接口

请求URL

GET/v1/agent/self

查看已注册的服务

一是在页面中查看,二是GET请求访问/v1/agent/services。

注册健康检查

你可以注册一个单独的健康检查,通过HTTP接口。

请求URL

PUT/v1/agent/check/register

请求示例

{

"ID":"mem",//checkID

"Name":"Memory utilization",//检查的名称

"Notes":"Ensure we don't oversubscribe memory",//检查的备注

"ServiceID":"redis1",//你也可以不填写服务ID,单单启动一个健康检查

//HTTP和TCP选一种

"HTTP":"https://example.com",

"TCP":"example.com:22",

"Interval":"10s",

"Timeout":"15s"

}

查看所有服务的检查

可以在页面中查看,也可以通过GET请求访问/v1/agent/checks

查看集群中某个服务的健康状态

可以在页面中查看,可以通过GET请求访问/v1/health/service/{service}

service:指服务的名称

集群配置

下面演示如何搭建两台服务器的集群。

假设有两台服务器A和B,如果要启动两台服务器的集群,请在A和B的application.yml严格按照如下要求配置。

A的application.yml

server:

port: 8500

spring:

datasource:

username: root

password: 123456

url: jdbc:mysql://62.234.44.124:3306/consul_schema#将A和B连接至相同数据库

driver-class-name: com.mysql.cj.jdbc.Driver

http:

converters:

preferred-json-mapper: gson

mybatis:

mapper-locations: classpath:/mappers/*.xml

type-aliases-package: com.yealink.entities

configuration:

map-underscore-to-camel-case: true

consul:

debug-config:

bind-address: 10.83.2.93#配置好A的IP地址

config:

node-name: myNode1#A的节点名,保持节点名在数据库中唯一!

datacenter: CN_DC1#A要加入的集群,配置和B一致

B的application.yml

server:

port: 8500

spring:

datasource:

username: root

password: 123456

url: jdbc:mysql://62.234.44.124:3306/consul_schema#和A连接至相同数据库

driver-class-name: com.mysql.cj.jdbc.Driver

http:

converters:

preferred-json-mapper: gson

mybatis:

mapper-locations: classpath:/mappers/*.xml

type-aliases-package: com.yealink.entities

configuration:

map-underscore-to-camel-case: true

consul:

debug-config:

bind-address: 192.168.160.128 #配置好B的IP地址

config:

node-name: myNode2#B的节点名,保持节点名在数据库中唯一!

datacenter: CN_DC1#B要加入的集群,配置和B一致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值