consul客户端配置微服务实例名称和ID
时间:2019-11-25
本文章向大家介绍consul客户端配置微服务实例名称和ID,主要包括consul客户端配置微服务实例名称和ID使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
consul客户端必须配置微服务实例名称和ID,微服务启动的时候需要将名称和ID注册到注册中心,后续微服务之间调用也需要用到.
名称可以通过以下两种方式配置,优先级从高到低.两个都不配置则默认服务名称为application
spring.cloud.consul.discovery.service-name
spring.application.name
ID可以通过多个配置项配置,下面的五种配置都可以,优先级从高到低.
spring.cloud.consul.discovery.instance-id
vcap.application.instance_id
spring.application.name和spring.application.instance_id搭配,'-'分隔
spring.application.name和server.port搭配,'-'分隔
spring.application.name
spring.application.instance_id
如果不配置启动会报错,相关日志如下,从日志中也可以看出,配置要求必须以字母开始,字母或数字结尾.
Caused by: java.lang.IllegalArgumentException: Consul service ids must not be empty, must start with a letter, end with a letter or digit, and have as interior characters only letters, digits, and hyphen: 8081
at org.springframework.cloud.consul.serviceregistry.ConsulAutoRegistration.normalizeForDns(ConsulAutoRegistration.java:179) ~[spring-cloud-consul-discovery-2.0.1.RELEASE.jar:2.0.1.RELEASE]
at org.springframework.cloud.consul.serviceregistry.ConsulAutoRegistration.getInstanceId(ConsulAutoRegistration.java:170) ~[spring-cloud-consul-discovery-2.0.1.RELEASE.jar:2.0.1.RELEASE]
at org.springframework.cloud.consul.serviceregistry.ConsulAutoRegistration.registration(ConsulAutoRegistration.java:78) ~[spring-cloud-consul-discovery-2.0.1.RELEASE.jar:2.0.1.RELEASE]
代码详见org.springframework.cloud.consul.serviceregistry.ConsulAutoRegistration
public static ConsulAutoRegistration registration(AutoServiceRegistrationProperties autoServiceRegistrationProperties, ConsulDiscoveryProperties properties, ApplicationContext context, List<ConsulRegistrationCustomizer> registrationCustomizers, HeartbeatProperties heartbeatProperties) {
NewService service = new NewService();
//注册到consul服务端时显示的微服务名称,优先级从高到低:
//配置项spring.cloud.consul.discovery.service-name
//配置项spring.application.name
//默认值application
String appName = getAppName(properties, context.getEnvironment());
//注册到consul服务端时显示的微服务Id,优先级从高到低:
//配置项spring.cloud.consul.discovery.instance-id
//配置项vcap.application.instance_id
//配置项spring.application.name和spring.application.instance_id,用':'拼接
//配置项spring.application.name和server.port,用':'拼接
//配置项spring.application.name
//配置项spring.application.instance_id
//注意,内部的normalizeForDns方法,用于规范化应用名称、ID等,把非数字字符串转换成'-'连接符
//比如spring.application.name=sc--test,server.port=8080,拼成的id为sc--test:8080,经过normalizeForDns方法就转换成了sc-test-8080
service.setId(getInstanceId(properties, context));
if(!properties.isPreferAgentAddress()) {
service.setAddress(properties.getHostname());
}
//微服务应用名称也必须符合规范,字母开始,字母或数字结尾
service.setName(normalizeForDns(appName));
//设置标签,spring.cloud.consul.discovery.tags
service.setTags(createTags(properties));
if(properties.getPort() != null) {
service.setPort(properties.getPort());
setCheck(service, autoServiceRegistrationProperties, properties, context, heartbeatProperties);
}
ConsulAutoRegistration registration = new ConsulAutoRegistration(service, autoServiceRegistrationProperties, properties, context, heartbeatProperties);
customize(registrationCustomizers, registration);
return registration;
}
//字符串不能为空,首字符必须为字母,尾字符必须为字母或数字,所有非字母数字的字符统一转换成'-'连接符,同时多个连续连接符转换成一个'-'.
public static String normalizeForDns(String s) {
if(s != null && Character.isLetter(s.charAt(0)) && Character.isLetterOrDigit(s.charAt(s.length() - 1))) {
StringBuilder normalized = new StringBuilder();
Character prev = null;
char[] var3 = s.toCharArray();
int var4 = var3.length;
for(int var5 = 0; var5 < var4; ++var5) {
char curr = var3[var5];
Character toAppend = null;
if(Character.isLetterOrDigit(curr)) {
toAppend = Character.valueOf(curr);
}
//不为数字和字母的字符转换成'-'分隔符,连续多个非字母数字字符转换成一个'-'分隔符
//这里做了一层判断,只有在前一个字符为字母数字的时候,才把当前的字符转换成'-'; 如果前一个为'-'则这个字符忽略不拼接.
//其实这里的prev只有在第一次的时候为null但是第一次的时候走不到else if这个条件
else if(prev == null || prev.charValue() != 45) {
toAppend = Character.valueOf('-');
}
if(toAppend != null) {
normalized.append(toAppend);
prev = toAppend;
}
}
return normalized.toString();
} else {
throw new IllegalArgumentException("Consul service ids must not be empty, must start with a letter, end with a letter or digit, and have as interior characters only letters, digits, and hyphen: " + s);
}
}
原文地址:https://www.jianshu.com/p/83d3a8105620
原文地址:https://www.cnblogs.com/jpfss/p/11928378.html
- Mac系统的Proton恶意软件:卷!土!重!来!
- Erlang语言学习入门
- Android使用Ant进行apk多渠道打包
- Dance In Heap(三):一些堆利用的方法(中)
- Android性能优化篇:使用软引用和弱引用
- 使用泛型委托,构筑最快的通用属性访问器
- 记录容易忘记的方法
- 无需重新编译代码,在线修改表单
- 使用反射+缓存+委托,实现一个不同对象之间同名同类型属性值的快速拷贝
- 结构变量作为方法的参数调用,在方法内部使用的“坑”你遇到过吗?
- 使用表达式树,让访问者直接执行“角色”对象的方法
- 【更正】“给自定义控件(Web Control)添加事件的几种方法”有一个不太准确的地方。
- 在数据库上实现类似铁路售票锁票功能
- Android代码判断手机是否已root方法学习
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【python-leetcode141-快慢指针】环形链表
- python-快速排序
- 【python-leetcode75-双指针】颜色分类
- 【python-leetcode713-双指针】乘积小于k的子数组
- vuejs之构建简易音乐播放器
- vuejs小例子之天气查询
- 【python-leetcode259-双指针】三个数的最小和
- vuejs之vue.js+axios结合使用
- c语言之指向指针的指针
- c语言之利用#if #endif来进行注释或者运行不同的主函数
- c++之对组pair
- c++STL容器之set/multiset容器
- c++STL容器之list容器
- c++STL容器之deque容器
- Web自动化必会「Web基础、元素定位、元素操作、Selenium运行原理、项目实战+框架」