96SEO 2026-02-23 13:57 17
多个组件,作为一个整体,它为基础设施提供服务发现和服务配置的工具,提供以下关键特性:

服务发现consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易一些外部服务,例如saas提供的也可以一样注册,consul采用Raft一致性协议算法来保证服务的高可用,使用GOSSIP协议管理成员和广播消息
健康检查健康检测使consul可以快速的告警在集群中的操作,和服务发现的集成可以防止服务转发到故障的服务上面(心跳机制)
键/值存储一个用来存储动态配置的系统,提供简单的HTTP接口可以在任何地方操作
简易安装:安装包仅包含一个二进制文件,支持跨平台,可与Docker等轻量级容器实现无缝对接
官方建议最好是三台或者三台以上的consul在运行同名服务最好是三台或三台以上默认可
Git地址https://github.com/hashicorp/consul
Linux、windows和macOS),安装包仅包含一个可执行文件,
Consul安装非常简单只需要下载对应系统的软件包并解压后就可使用
https://www.consul.io/downloads
https://apt.releases.hashicorp.com/gpg
https://apt.releases.hashicorp.com
https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
如果要全局使用请把consul加入到环境变量或者下载解压后将文件放置在
3或者5个server,因为部署单一server在出现失败时也许会不可避免的出现数据丢失
:保存配置信息、实现高可用集群、在局域网内与本地客户端通讯、通过广域网与其他数据中心通讯等,
consul安装好之后在使用之前,先了解一下consul都有哪些命令,使用命令
-h可以查看consul支持的所有参数而且每个参数里面还支持其他参数
agent参数说明指令是consul的核心它运行agent来维护成员的重要信息、运行检查、服务宣布、查询处理等等
github.com/hashicorp/consul,或者在import中引入
github.com/hashicorp/consul/api后,使用go
grpc服务注册到consul上,找到server/hello/main.go,编辑,代码如下:
(contextfmtnetgoogle.golang.org/grpcgithub.com/hashicorp/consul/apiserverHello/proto/helloService
)//rpc远程调用的接口,需要实现hello.proto中定义的Hello服务接口,以及里面的方法
//1.定义远程调用的结构体和方法,这个结构体需要实现HelloServer的接口type
struct{}//SayHello方法参考hello.pb.go中的接口
以及返回的参数HelloRes进行约束SayHello(context.Context,
consul服务相关----------------------//注册consul服务//1、初始化consul配置consulConfig
api.DefaultConfig()//设置consul服务器地址:
如果consul部署到其它服务器上,则填写其它服务器地址//consulConfig.Address
127.0.0.1:8500//2、获取consul操作对象consulClient,
api.AgentServiceRegistration{ID:
循环检测间隔时间},}//4、注册服务到consul上consulClient.Agent().ServiceRegister(agentService)//-------------------------
grpc相关----------------------//1.
注册服务//helloService.RegisterHelloServer(grpcServer,
new(Hello)相同helloService.RegisterHelloServer(grpcServer,
listener.Close()//5、启动服务grpcServer.Serve(listener)
说明HelloService微服务注册到了consul这个服务发现中了
grpc服务客户端代码修改一下,通过consul获取hello微服务相关,找到server/client/main.go,编辑,增加了
consul服务相关代码,在连接服务器的时候,使用consul返回的微服务地址,
(client/proto/helloServicecontextfmtgoogle.golang.org/grpcgithub.com/hashicorp/consul/apigoogle.golang.org/grpc/credentials/insecurestrconv
{//----------------------------consul相关---------------------------//初始化consul配置,
api.DefaultConfig()//设置consul服务器地址:
如果consul部署到其它服务器上,则填写其它服务器地址//consulConfig.Address
127.0.0.1:8500//2、获取consul操作对象consulClient,
//目前先屏蔽error,也可以获取error进行错误处理//3、获取consul服务发现地址,返回的ServiceEntry是一个结构体数组//参数说明:service服务名称,服务端设置的那个Name,
consulClient.Health().Service(HelloService,
nil)//打印地址fmt.Println(serviceEntry[0].Service.Address)fmt.Println(serviceEntry[0].Service.Port)//拼接地址//strconv.Itoa:
serviceEntry[0].Service.Address
strconv.Itoa(serviceEntry[0].Service.Port)//----------------------------hello微服务相关------------------------------//
1、连接服务器/*credentials.NewClientTLSFromFile
从输入的证书文件中为客户端构造TLS凭证。
grpc.WithTransportCredentials
配置连接级别的安全凭证例如TLS/SSL返回一个DialOption用于连接服务器。
*///把上面拼接的地址放入下面grpcClient,
grpc.WithTransportCredentials(insecure.NewCredentials()))if
{fmt.Println(err)}//2、注册客户端client
helloService.NewHelloClient(grpcClient)//3、调用服务端函数,
https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.type
以及返回的参数HelloRes进行约束SayHello(ctx
client.SayHello(context.Background(),
err1)return}fmt.Printf(%#v\r\n,
修改服务端hello微服务main.go中的端口号,改为8081,然后重新运行该微服务,再使用客户端请求服务发现,看看返回的hello微服务对应的端口号发生变化没有,如果发生变化了,说明操作成功,以此为案例,开发者可以把微服务服务端部署到不同服务器上,并指定对应的端口,从而实现微服务的负载均衡操作
F:\www\go-data\src\go_code\micro\grpc_demo\server\hellogo
goods微服务注册到consul上,找到server/goods/main.go,编辑,代码如下:
(contextfmtgithub.com/hashicorp/consul/apigoods/proto/goodsServicenetgoogle.golang.org/grpcstrconv
)//rpc远程调用的接口,需要实现goods.proto中定义的Goods服务接口,以及里面的方法
//1.定义远程调用的结构体和方法,这个结构体需要实现GoodsServer的接口type
struct{}//GoodsServer方法参考goods.pb.go中的接口
以及返回的参数AddGoodsRes进行约束AddGoods(context.Context,
返回参数GetGoodsRes是一个商品相关的切片GetGoods(context.Context,
{fmt.Println(req)//模拟返回操作,正式项目在这里进行数据库的操作即可,根据操作结果,返回相关数据return
goodsService.AddGoodsRes{Message:
//定义返回的商品列表切片//模拟从数据库中获取商品的请求,循环结果,把商品相关数据放入tempList切片中for
goodsService.GetGoodsRes{GoodsList:
consul服务相关----------------------//注册consul服务//1、初始化consul配置consulConfig
api.DefaultConfig()//设置consul服务器地址:
如果consul部署到其它服务器上,则填写其它服务器地址//consulConfig.Address
127.0.0.1:8500//2、获取consul操作对象consulClient,
api.AgentServiceRegistration{ID:
循环检测间隔时间},}//4、注册服务到consul上consulClient.Agent().ServiceRegister(agentService)//1.
注册服务//helloService.RegisterGoodsServer(grpcServer,
new(Hello)相同goodsService.RegisterGoodsServer(grpcServer,
listener.Close()//5、启动服务grpcServer.Serve(listener)
说明GoodsService微服务注册到了consul这个服务发现中了
grpc服务注册客户端代码修改一下,通过consul获取goods微服务相关,找到server/goods/main.go,编辑,增加了
consul服务相关代码,在连接服务器的时候,使用consul返回的微服务地址,
(client/proto/goodsServicecontextfmtgithub.com/hashicorp/consul/apigoogle.golang.org/grpcgoogle.golang.org/grpc/credentials/insecurestrconv
{//----------------------------consul相关---------------------------//初始化consul配置,
api.DefaultConfig()//设置consul服务器地址:
如果consul部署到其它服务器上,则填写其它服务器地址//consulConfig.Address
127.0.0.1:8500//2、获取consul操作对象consulClient,
//目前先屏蔽error,也可以获取error进行错误处理//3、获取consul服务发现地址,返回的ServiceEntry是一个结构体数组//参数说明:service服务名称,服务端设置的那个Name,
consulClient.Health().Service(HelloService,
nil)//打印地址//fmt.Println(serviceEntry[0].Service.Address)//fmt.Println(serviceEntry[0].Service.Port)//拼接地址//strconv.Itoa:
serviceEntry[0].Service.Address
strconv.Itoa(serviceEntry[0].Service.Port)//----------------------------hello微服务相关------------------------------//
1、连接服务器/*credentials.NewClientTLSFromFile
从输入的证书文件中为客户端构造TLS凭证。
grpc.WithTransportCredentials
配置连接级别的安全凭证例如TLS/SSL返回一个DialOption用于连接服务器。
*///把上面拼接的地址放入下面//grpcClient,
grpc.WithTransportCredentials(insecure.NewCredentials()))//if
fmt.Println(err)//}//2、注册客户端//client
helloService.NewHelloClient(grpcClient)//3、调用服务端函数,
https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.type
以及返回的参数HelloRes进行约束SayHello(ctx
client.SayHello(context.Background(),
return//}////fmt.Printf(%#v\r\n,
res.Message)----------------------------goods微服务相关--------------------------//3、获取consul服务发现地址,返回的ServiceEntry是一个结构体数组//参数说明:service服务名称,服务端设置的那个Name,
consulClient.Health().Service(GoodsService,
nil)//打印地址fmt.Println(serviceGoodsEntry[0].Service.Address)fmt.Println(serviceGoodsEntry[0].Service.Port)//拼接地址//strconv.Itoa:
serviceGoodsEntry[0].Service.Address
strconv.Itoa(serviceGoodsEntry[0].Service.Port)//
1、连接服务器/*credentials.NewClientTLSFromFile
从输入的证书文件中为客户端构造TLS凭证。
grpc.WithTransportCredentials
配置连接级别的安全凭证例如TLS/SSL返回一个DialOption用于连接服务器。
*/grpcGoodsClient,
grpc.WithTransportCredentials(insecure.NewCredentials()))if
{fmt.Println(err)}//2、注册客户端clientGoods
goodsService.NewGoodsClient(grpcGoodsClient)//增加res1,
clientGoods.AddGoods(context.Background(),
goodsService.AddGoodsReq{Goods:
测试商品的内容,},})fmt.Println(res1.Message)fmt.Println(res1.Success)//获取商品数据res2,
clientGoods.GetGoods(context.Background(),
goodsService.GetGoodsReq{})fmt.Printf(%#v,
main(){//初始化consul配置,客户端服务器需要一致consulConfig
api.DefaultConfig()//获取consul操作对象registerClient,_
api.NewClient(consulConfig)//注销服务ServiceDeregister(ServerID),ServerID:
微服务服务端服务发现idregisterClient.Agent().ServiceDeregister(1)
以及向上级或远程数据中心转发查询并且会将数据持久化,推荐使用3到5台机器
客户模式(client模式):客户模式下ConsulAgent是一个非常轻量级的进程它消耗最小的资源开销和少量的网络带宽提供注册服务运行健康检查并将查询转发给服务器,客户端是相对无状态的客户端执行的唯一后台活动是LANgossip池不负责数据的持久化,客户模式不能单独存在必须要有一个服务模式的Consul
数据中心:一个数据中心由多个Server和Client模式Consul组成,多个数据中心通过WAN通信,每个数据中心(数据中心是一个大型的计算机系统集群通常由成千上万台计算机、存储设备、网络设备、电源设备、冷却设备等组成以提供高效、可靠的计算和存储能力,主要功能是提供云计算、虚拟化、存储和数据处理等服务以满足企业、政府机构和个人的计算和数据存储需求,是现代企业和政府机构不可或缺的基础设施之一)至少必须拥有一台server,建议在一个集群中有3或者5个server,部署单一server在出现失败时会不可避免的出现数据丢失
至少必须拥有一个server,agent必须在集群中的每个主机上运行,
通过client注册服务使用保存配置信息、实现高可用集群、通过广域网与其他数据中心通讯等
是负载均衡地址服务注册到集群后由集群中的一个节点负责对该实例进行健康检查假如有这样的情况服务A服务B都注册到
在注册列表中消失导致无法无法访问到但是其实服务本身没有问题。
服务注销当服务从注册中心注销时由于是负载均衡的可能会导致服务注销失败因为要在Service1
所在机器的服务实例不影响另外一台机器上的实例。
服务注销服务注销值需要在
只存在于Server模式选取Leader节点Raft协议,为Leader节点和Client节点的提供RPC调用
LAN网中集群数据同步的通信端口(Gossip协议)也是加入集群的通信端口
只存在于Server模式WAN网中集群数据同步的通信端口(Gossip协议)也是加入集群的通信端口,主要支持数据中心与数据中心之间交互通过WLAN8302端口
8301和8302接口作用类似主要区分在于8301用于LAN网络8302用于WAN网络,它们都可以用于加入consul集群数据中心一致就是在一个集群将各数据中心连接则使用8302端口
Leader(主服务领导),这里在服务器Server1、Server2、Server3上分别部署了Consul
节点为Leader,这些服务器上最好只部署Consul程序以尽量维护Consul
准备四个虚拟机,安装好consul等相关软件(安装见上面讲解),三个虚拟机作为服务端(ip参考:192.168.1.129,192.168.1.130,192.168.1.131,),一个作为客户端(ip参考:192.168.1.132),
-data-dir/root/usr/local/consul/data
-data-dir/root/usr/local/consul/data
-data-dir/root/usr/local/consul/data
-config-dir/etc/consul.d/consul.d
需要先在/etc/下面创建consul.d里面所有以.json结尾的文件都会被加载
consul服务侦听地址这个地址提供HTTP、DNS、RPC等服务默认是127.0.0.1所以不对外提供服务如果要对外提供服务改成0.0.0.0,
告诉集群其他节点你通过这个ip来和我通信默认使用bind绑定的ip
server-port8300:选取Leader节点raft协议通信和提供RPC调用的
-data-dir/root/usr/local/consul/data
以server-01为Leader,分别在server-02、server-03、client-01节点上面运行下面命令建立集群关系
以server-01(192.168.1.129)为Leader,分别在server-02、server-03、client-01节点上面运行下面命令建立集群关系,
这样以server-01为Leader的集群就创建好了,浏览器打开web
ui,可以看见:在server-01的服务器上,关联了三个服务(2个服务端,1个客户端),图示如下:
以上面代码为案例,先注册服务到sever里面,把Hello微服务注册到server-03这个consul中,代码只需修改consulConfig.Address192.138.1.132,以及Hello微服务启动的地址,比如把127.0.0.1修改为本机地址192.168.1.111,这样才能让server-03和微服务服务器通讯,Goods微服务也类似操作
(contextfmtnetgoogle.golang.org/grpcgithub.com/hashicorp/consul/apiserverHello/proto/helloService
)//rpc远程调用的接口,需要实现hello.proto中定义的Hello服务接口,以及里面的方法
//1.定义远程调用的结构体和方法,这个结构体需要实现HelloServer的接口type
struct{}//SayHello方法参考hello.pb.go中的接口
以及返回的参数HelloRes进行约束SayHello(context.Context,
consul服务相关----------------------//注册consul服务//1、初始化consul配置consulConfig
api.DefaultConfig()//设置consul服务器地址:
192.168.1.132:8500//2、获取consul操作对象consulClient,
api.AgentServiceRegistration{ID:
循环检测间隔时间},}//4、注册服务到consul上consulClient.Agent().ServiceRegister(agentService)//-------------------------
grpc相关----------------------//1.
注册服务//helloService.RegisterHelloServer(grpcServer,
new(Hello)相同helloService.RegisterHelloServer(grpcServer,
listener.Close()//5、启动服务grpcServer.Serve(listener)
}修改完后,和上面启动微服务操作一致,启动完后,查看,如下:Leader上已经注册好了相关微服务了
然后修改微服务客服端代码,让consulConfig.Address
192.168.1.132:8500(一般连接的是consul客户端),这样就访问到consul的客户端client-01了,从客户端就可以获取微服务对应数据了
优雅的关闭Agent,中断Agent之后可以看到服务离开了集群并关闭,在退出中,Consul提醒其他集群成员,这个节点离开了,如果强行杀掉进程,集群的其他成员应该能检测到这个节点失效了,当一个成员离开,他的服务和检测也会从中移除,Consul会
自动尝试对失效的节点进行重连,允许他从某些网络条件下恢复过来,离开的节点则不会再继续联系,此外,如果一个agent作为一个服务器,一个优雅的离开是很重要的,可以避免引起潜在的可用性故障影响达成一致性协议
members在其他三台consul服务器上查看server-01是否停止
上可以打开,并且Leader已经发生变化(因为server-01停止了),
上面讲解的是一个客户端的案例,当然也可以一个微服务对应一个客户端,这样当一个服务器挂掉的话,就只会影响一个微服务,其他的微服务不会受到影响
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback