springBoot版本 : 2.0.3.RELEASE
1.8
Finchley.SR1
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-consul-discovery
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
server:
port: 8088
spring:
application:
name: cn-consul-test
cloud:
consul:
discovery:
instance-id: ${spring.application.name}-${spring.cloud.client.ip-address}-${server.port}
prefer-ip-address: true
host: 10.130.131.39
port: 8500
每个应用注册consul都会生成或指定一个唯一实例id
默认根据hostname+appName生成实例ID
同一个应用多个节点注册服务时,默认的ID生成规则会相互覆盖
解决服务注册覆盖方法有三种
1.指定实例ID(instance-id),规则中加入随机数:
${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}
2.指定实例ID(instance-id),规则中加入ip:
${spring.application.name}-${spring.cloud.client.ip-address}-${server.port}
3.自定义实例ID,此方法会在生成实例ID后,再生成自定义实例ID。
import com.ecwid.consul.v1.ConsulClient;
import org.springframework.cloud.consul.discovery.ConsulDiscoveryProperties;
import org.springframework.cloud.consul.discovery.HeartbeatProperties;
import org.springframework.cloud.consul.discovery.TtlScheduler;
import org.springframework.cloud.consul.serviceregistry.ConsulRegistration;
import org.springframework.cloud.consul.serviceregistry.ConsulServiceRegistry;
/**
*
*
* @author 0.0
* @since 2020-08-30 11:23
*/
public class MyConsulServiceRegistry extends ConsulServiceRegistry {
public MyConsulServiceRegistry(ConsulClient client, ConsulDiscoveryProperties properties, TtlScheduler ttlScheduler, HeartbeatProperties heartbeatProperties) {
super(client, properties, ttlScheduler, heartbeatProperties);
}
@Override
public void register(ConsulRegistration reg) {
reg.getService().setId(reg.getService().getName() +"-" + reg.getService().getAddress() + ":" + reg.getService().getPort());
super.register(reg);
}
}
import com.ecwid.consul.v1.ConsulClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.consul.discovery.ConsulDiscoveryProperties;
import org.springframework.cloud.consul.discovery.HeartbeatProperties;
import org.springframework.cloud.consul.discovery.TtlScheduler;
import org.springframework.cloud.consul.serviceregistry.ConsulServiceRegistry;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
*
*
* @author 0.0
* @since 2020-08-30 11:26
*/
@Configuration
public class MyConsulServiceRegistryConfig {
@Bean
public ConsulServiceRegistry getConsulServiceRegistry(ConsulClient consulClient, ConsulDiscoveryProperties properties,
HeartbeatProperties heartbeatProperties) {
return new MyConsulServiceRegistry(consulClient, properties, null, heartbeatProperties);
}
}
首先获取节点ID
生成删除节点的请求:
curl -X PUT http://10.130.131.39:8500/v1/agent/service/deregister/instance-idxxx
如:curl -X PUT http://10.130.131.39:8500/v1/agent/service/deregister/cn-consul-test-DESKTOP-G56EDDL:8088
服务器上执行请求
和zookeeper一样,服务注册是为了动态获取服务提供者并暴露给服务消费者(不同的是zookeeper+dubbo注册的服务更详细),节点动态扩充缩减增加了领用灵活性。
consul作为服务注册中间组件,接收并记录服务提供者信息(注册服务应用名,主机ip+端口等),而服务消费者则从consul获取服务提供者信息动态生成调用接口调用服务,形成基本的微服务调用。
应用使用过程中consul挂了,消费者还能调用服务提供者吗?可以!
consul提供的是存活的服务提供者列表,而消费者调用服务是根据服务提供者列表生成调用接口,本地也会缓存从consul获取到的服务提供者列表,一旦consul挂了,意味着消费者本地的服务提供者列表缓存无法再被更新了
服务提供者和消费者怎么区分的?不注册服务则只能做消费者,注册服务则即时服务提供者,也是服务消费者
spring.cloud.consul.discovery.register=false