1概述SpringCloudConsul项目为SpringBoot应用程序提供了与Consul的轻松集成。Consul是一种工具,它提供组件来解决微服务架构中一些最常见的挑战:服务发现-自动注册和注销服务实例网络位置健康检查-检测服务实例何时启动和运行分布式配置-确保所有服务实例使用相同的配置在本文中,我们将看到如何配置SpringBoot应用程序以使用这些功能。2先决条件首先,建议快速浏览一下Consul及其所有功能。在本文中,我们将使用在localhost:8500上运行的Consul代理。有关如何安装Consul和运行代理的更多详细信息,请参阅此链接。首先,我们需要添加spring-cloud-starter-consul-all的pom.xml依赖:/artifactId>3.1.13服务发现让我们编写第一个SpringBoot应用程序并连接到正在运行的Consul代理:@SpringBootApplicationpublicclassServiceDiscoveryApplication{publicstaticvoidmain(String[]args){newSpringApplicationBuilder(ServiceDiscoveryApplication.class).web(true).run(args);默认情况下,SpringBoot将尝试连接到位于localhost:8500的Consul代理。要使用其他设置,我们需要更新application.yml文件:spring:cloud:consul:host:localhostport:8500然后,如果我们在浏览器中访问Consul代理的站点http://localhost:8500,我们将看到我们的应用程序已在Consul中正确注册,标识符来自“${spring.application.name}:${comma-separatedconfigurationfiles}:${server.port}”。要自定义这个标识符,我们需要用另一个表达式更新属性spring.cloud.discovery.instanceId:spring:application:name:myAppcloud:consul:discovery:instanceId:${spring.application.name}:${random.value}如果我们再次运行该应用程序,我们将看到它使用标识符“MyApp”和一个随机值注册。我们需要它在本地机器上运行应用程序的多个实例。最后,要禁用服务发现,我们需要将属性spring.cloud.consul.discovery.enabled设置为false。3.1查找服务我们已经在Consul中注册了我们的应用程序,但是客户端如何找到服务端点呢?我们需要一个发现客户端服务来从Consul获取正在运行和可用的服务。Spring为此提供了一个DiscoveryClientAPI,我们可以使用@EnableDiscoveryClient注释启用它:@SpringBootApplication@EnableDiscoveryClientpublicclassDiscoveryClientApplication{//...}然后我们可以将DiscoveryClientbean注入我们的控制器并访问实例:@RestControllerpublicclassDiscoveryClientController{@AutowiredprivateDiscoveryClientdiscoveryClient;publicOptionalserviceUrl(){returndiscoveryClient.getInstances("myApp").stream().findFirst().map(si->si.getUri());}}最后,我们将定义我们的应用端点:@GetMapping("/discoveryClient")publicStringdiscoveryPing()throwsRestClientException,ServiceUnavailableException{URIservice=serviceUrl().map(s->s.resolve("/ping")).orElseThrow(ServiceUnavailableException::new);returnrestTemplate.getForEntity(service,String.class).getBody();}@GetMapping("/ping")publicStringping(){return"pong";}"myApp/ping”路径是Spring应用名,服务端点Consul会服务所有可用的名为“myApp”的应用程序。4HealthChecksConsul会定期检查服务端点的健康状况。默认情况下,Spring实现健康端点返回200OK在应用程序启动时。如果我们想自定义端点,我们必须更新application.yml:spring:cloud:consul:discovery:healthCheckPath:/my-health-checkhealthCheckInterval:20s所以Consul将秒轮询“/my-health-check"端点。让我们定义我们的自定义健康检查服务以返回FORBIDDEN状态:@GetMapping("/my-health-check")publicResponseEntitymyCustomCheck(){Stringmessage="Testingmyhealthcheckfunction";returnnewResponseEntity<>(message,HttpStatus.FORBIDDEN);}如果我们点击Consul代理站点,我们会看到我们的应用程序失败。要解决此问题,“/my-health-check”服务应返回HTTP200OK状态代码5分布式配置此功能允许在所有服务之间同步配置。Consul将监视任何配置更改,然后触发所有服务的更新。首先我们需要添加spring-cloud-starter-consul-config的pom.xml依赖:org.springframework.cloudspring-cloud-starter-consul-config3.1.1我们还需要将Consul和Spring应用程序名称的设置从application.yml文件移动到Spring首先加载的bootstrap.yml文件。然后我们需要启用SpringCloudConsulConfig:spring:application:name:myAppcloud:consul:host:localhostport:8500config:enabled:trueSpringCloudConsulConfig将在Consul的“/config/myApp”中查找属性。因此,如果我们有一个名为“my.prop”的属性,我们需要在Consul代理站点中创建该属性。我们可以通过转到“KEY/VALUE”部分创建属性,并在“CreateKey”表单中输入“/config/myApp/my/prop”和“HelloWorld”作为值。最后,单击“创建”按钮。请记住,如果我们使用Spring配置文件,我们需要将配置文件附加到Spring应用程序名称旁边。例如,如果我们使用dev配置文件,Consul中的最终路径将是“/config/myApp,dev”。现在,让我们看看带有注入属性的控制器是什么样的:@RestControllerpublicclassDistributedPropertiesController{@Value("${my.prop}")Stringvalue;@Autowired私有MyProperties属性;@GetMapping("/getConfigFromValue")publicStringgetConfigFromValue(){返回值;}@GetMapping("/getConfigFromProperty")publicStringgetConfigFromProperty(){returnproperties.getProp();}}和MyProperties类:@RefreshScope@Configuration@ConfigurationProperties("my")publicclassMyProperties{privateStringprop;//standardgetter,setter}如果我们运行应用程序,字段值和属性具有来自Consul的相同“HelloWorld”值。5.1更新配置如何在不重启SpringBoot应用的情况下更新配置?如果我们回到Consul代理站点并用另一个值更新属性“/config/myApp/my/prop”,例如“NewHelloWorld”,那么字段值将不会改变,字段属性将更新为“NewHelloWorld”如预期。这是因为字段属性是MyProperties类具有@RefreshScope注解。所有用@RefreshScope注释的bean都会在配置更改后刷新。在现实生活中,我们不应该直接在Consul中拥有这些属性,而是将它们持久存储在某个地方。我们可以使用ConfigServer来做到这一点。6结论在本文中,我们了解了如何设置SpringBoot应用程序以与Consul一起工作以进行服务发现、自定义健康检查规则和共享分布式配置。我们还介绍了一些方法供客户端调用这些已注册的服务。和往常一样,源代码可以在GitHub上找到。