Consul服务网格、集群、整合springcloud

Consul是一个分布式高可用服务网格解决方案,提供服务发现、配置、多数据中心等功能,最近试验了一把服务网格、集群等功能

不说概念,直接上干货,怎么搭建。

一.服务网格

官网案例:https://learn.hashicorp.com/consul/getting-started/connect

官网上有一个案例,有两个服务 socat和web,他们都一个边车代理,全部注册到consul server上,使用web 的边车 与socat的边车通信,从而完成访问scoat服务。这个过程中,scoat和web 内部都没有关于网络通信的功能,全部由边车完成。

但官网案例中,两个服务和边车、consul全部在一个机器里,我认为体现不出服务网格的效果,所以把这个案例修改下,把web、socat、consul分别部署在不同的机器,通过边车进行服务注册、发现、调用。

我这里用三台虚拟机, 机器一部署consul server(192.168.1.76),机器二部署socat和其边车(192.168.1.77),机器三部署web边车(192.168.1.75)

机器一部署consul:

consul有个特点,启动时可以指定配置文件,只要配置文件写明A服务要注册,启动后在consul UI页面上就会显示,A服务已经注册,即使A服务不存在,这点和eureka等注册中心不同(必须由服务主动发起注册)。

这一步和官网一样,在consul目录下建立 consul.d目录,作配置目录,里面建两个json文件,作socat和web的注册配置文件。

              

socat.json内容: 里面配置服务名是socat,所在address(官网案例没有写address,不写默认在服务在consul本机上)、端口 ,以及边车信息,边车代理了socat服务、边车代理服务的IP、端口。 

{
  "service": {
    "name": "socat",
    "port": 8181,
    "address":"192.168.1.77",     
    "connect": { 
		"sidecar_service": {
    	
                     "proxy": {
			    "destination_service_name": "socat",
			    "destination_service_id": "socat",
			    "local_service_address": "192.168.1.77",
			    "local_service_port": 8181
	    		} 
			}
		}
  }
}

 web.json内容:与socat大致相同,多了边车的负载均衡配置,upstreams指定了 边车将会监听9191端口,发送到75机器上的9191端口,就会被边车转发到socat服务。 

因为边车启动后,和consul相连,可以获取到scoat的服务地址。

{
  "service": {
    "name": "web",
    "address":"192.168.1.75",
    "port":80,
    "connect": {
      "sidecar_service": {
        "proxy": {
			"destination_service_name": "web",
         	    "destination_service_id": "web",
		    "local_service_address": "192.168.1.75",
		    "local_service_port": 80,
			  "upstreams": [
			    {
			      "destination_name": "socat",
			      "local_bind_port": 9191
			    }
			  ]
        }
      }
    }
  }
}

随后将consul启动:

consul agent -server -config-dir=./consul.d -dev -ui -client 0.0.0.0 -enable-script-checks

这些配置解释在官网都有 

  • -server:以server模式启动
  •  -config-dir:指定配置文件路径,服务注册配置文件
  • -dev:以开发模式启动,而不是集群
  • -ui:有ui页面
  • -client:指定可访问consul的IP,如果写为固定IP,会发现其他IP都无法访问consul
  • -enable-script-checks:允许通过配置文件和http api注册的服务

效果:consul特点,可以按配置文件注册服务,即使socat和web服务并没有启动。因为配置文件没有加健康检查的配置,所以是健康实例,否则服务会是红色标志。

机器二部署scoat和其边车:

scoat是一个类似echo命令的程序,会将输入字符串返回。

启动scoat服务:如果没有安装,会提示安装,启动成功后,相当于一个服务端,启动在8181端口

socat -v tcp-l:8181,fork exec:"/bin/cat"

测试scoat: 与8181端口通信

nc 127.0.0.1 8181

启动scoat边车: -http-addr 参数指定了consul服务端地址,这个参数官网案例没有,所以不指定会默认找本地的consul。

吐槽一句这个参数花了很久时间才找到。

consul connect proxy  -http-addr=192.168.1.76:8500  -sidecar-for socat

机器三部署web的边车

官网案例中,web服务并不存在,即虽然注册中心有web服务信息,但web服务并没有真实启动。

这不影响案例,只要启动了web边车,就可以通过web边车监听的端口与socat通信,当然web边车控制台会报错,因为连不上web服务,没关系不影响案例进行。

启动web边车:

consul connect proxy  -http-addr=192.168.1.76:8500  -sidecar-for web

启动后报错,找不到本机80端口的web服务 ,因为在consul制定了web的端口为80。

在机器三与机器一的socat通信,通过web边车所监听的9191端口

nc 127.0.0.1 9191

成功:

总结

1.服务注册、边车代理的配置信息都在consul server端,服务和边车几乎没有配置信息

2.服务调用还是要通过边车所监听的端口,如果web是个真实服务,那web编码应该得在程序中硬编码端口,或者写在配置文件,使用http通信或者其他通信方式,也是挺麻烦的,毕竟现在服务网格落地的方案少,还没有太多案例可借鉴。

二.集群

consul集群最少使用三个节点,只有三个节点才能完成leader选举。

集群搭建在这里使用四台机器,三个虚拟机加本机,一会试一下leader宕机后,重新选举的过程。

机器一leader节点:

consul agent -server -bootstrap-expect=4 -data-dir=./data -node=server1 -bind=192.168.1.75 -client=0.0.0.0 -ui 
  • -bootstrap-expect=4  集群期待四个节点
  • -data-dir=./data 数据存放路径
  • -node=server1 节点名称
  • -bind=192.168.1.75 节点所在IP

建议启动时把之前的data文件夹删除,consul会按历史数据去寻找曾经注册服务记录,如果服务不在了,还会一直报错找不到。

机器二节点:

consul agent -server -bootstrap-expect=4 -data-dir=./data -node=server2 -bind=192.168.1.76 -client=0.0.0.0 -ui -join 192.168.1.75
  •  -join 192.168.1.75:指定节点的leader,要加入的集群IP

机器三:

consul agent -server -bootstrap-expect=4 -data-dir=./data -node=server3 -bind=192.168.1.77 -client=0.0.0.0 -ui -join 192.168.1.75

机器四:

consul agent -ui -server  -bootstrap-expect=4 -data-dir=X:\Geek\console\data -node=server4 -bind=192.168.1.74 -client=0.0.0.0 -join 192.168.1.75

全部启动成功后,集群才会打印日志说leader选举成功。

三.整合springcloud

springcloudconsul提供了对consul功能的整合,简单看一下

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-all</artifactId>
        </dependency>

@EnableDiscoveryClient 可完成对consul、eureka、nacos全部注册

@EnableDiscoveryClient
@SpringBootApplication
public class NacosProviderApplication {

	public static void main(String[] args) {
		SpringApplication.run(NacosProviderApplication.class, args);
	}

}

配置文件指定consul所在地址,如果是集群的话,只需要写集群的一个节点就可以注册上去,不需要全写,这点跟eureka、nacos不同。

 后面是健康检查等等不说了。

server:
  port: 9004
spring:
  application:
    name: consul-provider
  cloud:
    consul:
#      host: 127.0.0.1   # consul 启动地址
      host: 192.168.1.75
      port: 8500        # consul 启动端口
      discovery:
        prefer-ip-address: true
        health-check-interval: 5s
        health-check-path: /actuator/health
        hostname: 192.168.1.5
        port: 9004
      config:
        enabled: true

启动注册成功后,完成feign调用都很简单。

如果consul集群中的leader节点宕机的话,重新启动服务注册,会发现此时是无法注册的,因为consul是没有高可用特性,在leader重新选举成功之前,整个集群对外都不可用。

猜你喜欢

转载自blog.csdn.net/u014203449/article/details/107806931