我正在玩Docker和Consul,我有一些关于代理服务映射的问题,特别是在docker环境中.假设我有一个服务名称"myGreatService"是简单的web nodejs helloworld应用程序,封装了名为"myGreatServiceImage"的docker镜像.从Consul文档中我了解到,当您注册服务(通过HTTP或服务定义文件)时,服务即将"连线"到代理/ consul节点(可以通过/ v1/catalog/service /检索有线节点) .因此,如果consul节点关闭(或节点运行状况检查确定它已关闭),那么"连接"到该消耗节点的所有服务将自动标记为关闭.我对吗 ?
如果我通过docker在一台主机上多次运行我的GreatServiceImage映像(由于"myGreatService"服务的多个实例),我应该运行多少个代理?每个主机管理该主机上的所有容器(所有服务实例)?或者可能是每个容器(服务实例)的单独代理?
我有多个运行Docker的主机,我使用Consul作为键值存储.我能够创建覆盖网络,容器可以看到彼此的主机名和IP,/ etc/hosts在创建/销毁容器时很好地更新.但是,不同主机上的容器实际上不能相互连接(同一主机上的容器可以).
我一直在调查日志,Docker守护程序日志包含以下内容:
[INFO] serf: EventMemberJoin: vagrant-ubuntu-trusty-64 192.168.57.103
[ERR] memberlist: Conflicting address for vagrant-ubuntu-trusty-64. Mine: 192.168.57.103:7946 Theirs: 192.168.57.102:7946
[ERR] serf: Node name conflicts with another node at 192.168.57.102:7946. Names must be unique! (Resolution enabled: true)
Run Code Online (Sandbox Code Playgroud)
Docker守护进程应该以某种方式识别自己吗?看起来Serf很困惑,因为每个守护进程只使用主机名作为标识符.
我下面列出的类 ( ServiceDiscoveryConfiguration) 从未被使用过。即使我删除了@EnableDiscoveryClient以试图完全避免设置,它仍然会尝试连接到 Consul。
唯一对我有用的是完全删除 Consul Maven 依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-all</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
如果不通过配置文件和注释设置,我可以做些什么来阻止 Consul 运行单元测试?
我有一个使用 Spring Consul 的应用程序。我设置了一个类来启用这样的发现:
@Profile ("!" + Profiles.UNIT_TEST)
@Configuration
@EnableDiscoveryClient
public class ServiceDiscoveryConfiguration {
}
Run Code Online (Sandbox Code Playgroud)
如果我没记错的话,这应该是禁用 Consul 部分。基本测试类(它abstract在我的所有单元测试之间共享)使用以下注释设置。这就是我认为问题所在。
@SpringBootTest (classes = Service.class)
@WebAppConfiguration
@TestExecutionListeners (...)
@DirtiesContext
@ActiveProfiles (Profiles.UNIT_TEST)
@Test (...)
public abstract class AbstractBootTest extends AbstractTestNGSpringContextTests {
// ...
}
Run Code Online (Sandbox Code Playgroud)
当我执行我的测试时,我得到:
引起:com.ecwid.consul.transport.TransportException:java.net.ConnectException:连接被拒绝
这让我相信配置文件激活不起作用,或者我!在@Profile规范上使用运算符的语法没有做我认为应该做的事情。根执行类本身有基本的注释,包括一个@ComponentScan注释,我知道它有适当的包被扫描。 …
我有领事在Mesos上运行的Consul v0.5.2版本和服务上运行.服务从1台服务器转移到另一台服务器.
是否有办法取消注册处于"失败"状态的领事服务?我可以使用此卷曲获取处于失败状态的服务列表
curl http://localhost:8500/v1/health/state/critical
Run Code Online (Sandbox Code Playgroud)
我们看到的问题是在consul UI中的一段时间内我们有过时的数据并使整个UI无法使用
我的 Prometheus 服务器从 Consul 获取它的目标列表(或“服务”,在 Consul 的行话中)。我只想监控这些目标的一个子集。这应该可以通过 Prometheus 的正则表达式机制实现,但正确的配置让我望而却步。这是怎么做的?
我正在将 Spring Boot 应用程序作为 Docker 容器运行。到目前为止,这工作得很好,但是当我尝试使用 Spring Cloud Consul 时,它也让我有些头痛。它可以很好地从 Consul KVS 读取配置,但健康检查似乎正在运行。
默认运行状况检查使用 docker 容器的主机名,例如http://users-microservice/health。显然,从领事访问时这不会解决。
没问题,文档提到您可以在 bootstrap.yml 文件中使用healthCheckPath来配置它。这就是我现在所拥有的:
spring:
application:
name: users-microservice
cloud:
consul:
host: myserver.com
port: 8500
config:
prefix: API-CONFIG
profileSeparator: '__'
discovery:
tags: users-microservice
healthCheckPath: http://myserver.com:${server.port}/status
healthCheckInterval: 30s
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个变量的使用方式似乎与我预期的非常不同。这就是领事试图达到的目标:
Get http://users:18090http//myserver.com:18090/status: dial tcp: unknown port tcp/18090http
我怎样才能解决这个问题?我应该设置一些未记录的配置参数吗?
我试图将我的注册服务器从"Eureka"更改为"Consul",并将Consul更改为我的配置服务器.使用Consul进行服务发现是成功的.但我无法理解如何获取键/值对选项来引导我的应用程序.我有可能做到这一点吗?
我使用具有以下依赖性的弹簧靴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这是我的春季启动应用程序ConsuleDemoApplication.class
@EnableDiscoveryClient
@SpringBootApplication
@RestController
public class ConsuleDemoApplication {
@RequestMapping("/")
public String home() {
return "Hello world";
}
public static void main(String[] args) {
SpringApplication.run(ConsuleDemoApplication.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
和我的bootstrap.yml是
spring:
cloud:
consul:
discovery:
healthCheckInterval: 15s
instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}}
application:
name: consul_demo
Run Code Online (Sandbox Code Playgroud) configuration spring-boot consul microservices spring-cloud-consul
我在我希望删除的领事集群中创建了一堆测试服务,我尝试使用 /v1/agent/service/deregister/{service id} - 并确保它在每个节点上运行良好 - 我可以看到这一点在每个节点上运行
[INFO] 代理:注销服务“ci”
还有另一种方法可以手动清除这些旧服务吗?
谢谢,
我有以下领事模板。
{{ range service "mysql_slave.mysql" "any" }}
host_name {{.Node}}
command check_nrpe!check_procs_1
{{end}}
Run Code Online (Sandbox Code Playgroud)
我想添加如果我的主机名匹配“database-1”然后命令“check_procs_1”和其他命令“check_procs_2”
输出
host_name node_server
command check_nrpe!check_procs_2
host_name database-1
command check_nrpe!check_procs_1
host_name webserver
command check_nrpe!check_procs_2
Run Code Online (Sandbox Code Playgroud) 我是领事的新人。
我正在尝试从 Json 文件导入键/值对。(在Windows环境下工作)
但是当我尝试使用以下命令导入时,遇到错误。
命令:
consul.exe kv import @keyvalue.json
Run Code Online (Sandbox Code Playgroud)
内容:
{"MYVAR": "123","AnotherKey":"SomeValueHere"}
Run Code Online (Sandbox Code Playgroud)
错误:
无法解组数据:json:无法将对象解组为 []*command.kvExportEntry 类型的 Go 值
任何人都可以提出一些想法来解决这个错误。
谢谢。
consul ×10
spring-boot ×3
consul-kv ×1
docker ×1
if-statement ×1
json ×1
mesos ×1
mesosphere ×1
overlay ×1
prometheus ×1
puppet ×1
spring ×1
spring-cloud ×1
vagrant ×1