详解使用Spring Cloud Consul实现服务的注册和发现

作者:西夏一品堂 时间:2023-06-08 03:46:23 

首先安装consul环境,参照之前的文章:https://www.jb51.net/article/141789.htm

项目规划,2个服务端,1个客户端

首先来看服务端,

一:服务端1:

项目依赖


<dependencyManagement>
 <dependencies>
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-consul-dependencies</artifactId>
     <version>1.0.1.RELEASE</version>
     <type>pom</type>
     <scope>import</scope>
   </dependency>
 </dependencies>
</dependencyManagement>

<dependencies>
 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-actuator</artifactId>
   <version>1.3.5.RELEASE</version>
 </dependency>
 <dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-consul-discovery</artifactId>
 </dependency>
</dependencies>

注意,增加spring-boot-actuator是为了项目可以访问/health 路径来判断服务是否健康


package com.pp.consul1;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConsulApp {

@RequestMapping("/home")
 public Object home() {
   System.out.println("1111111111111");
   return "OK11";
 }

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

application.properties 配置内容


server.port=9955  
spring.application.name=Consul-Server-1
spring.cloud.consul.host=192.168.1.100
spring.cloud.consul.port=8500
spring.cloud.consul.enabled=true
spring.cloud.consul.discovery.enabled=true
spring.cloud.consul.discovery.instanceId=tomcat1
spring.cloud.consul.discovery.serviceName=tomcat
spring.cloud.consul.discovery.hostname=192.168.2.95
spring.cloud.consul.discovery.port=${server.port}
spring.cloud.consul.discovery.healthCheckUrl=http://192.168.2.95:9955/health
spring.cloud.consul.discovery.healthCheckInterval=10s
spring.cloud.consul.discovery.tags=dev

看过我之前文章的,应该对这些配置很清楚了。这样,一个服务端就配置写好了。

由于我们增加了@EnableDiscoveryClient注解,所以,系统启动的时候,就会向consul注册一个服务,服务的名字为tomcat, ID为tomcat1

访问consul的HTTP API /v1/catalog/service/tomcat 输出如下:


{
 "Node":"192.168.1.100",
 "Address":"192.168.1.100",
 "ServiceID":"tomcat1",
 "ServiceName":"tomcat",
 "ServiceTags":["dev"],
 "ServiceAddress":"192.168.2.95",
 "ServicePort":9955,
 "ServiceEnableTagOverride":false,
 "CreateIndex":993,
 "ModifyIndex":1057
}

二:服务端2

项目依赖和上面一样 


package com.pp.consul2;  
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConsulApp {

@RequestMapping("/home")
 public Object home() {
   System.out.println("2222222222222222");
   return "OK22";
 }

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

application.properties 配置内容:


server.port=9966

spring.application.name=Consul-Server-2
spring.cloud.consul.host=192.168.1.100
spring.cloud.consul.port=8500
spring.cloud.consul.enabled=true
spring.cloud.consul.discovery.enabled=true
spring.cloud.consul.discovery.instanceId=tomcat2
spring.cloud.consul.discovery.serviceName=tomcat
spring.cloud.consul.discovery.hostname=192.168.2.95
spring.cloud.consul.discovery.port=${server.port}
spring.cloud.consul.discovery.healthCheckUrl=http://192.168.2.95:9966/health
spring.cloud.consul.discovery.healthCheckInterval=10s
spring.cloud.consul.discovery.tags=test

三:客户端

项目依赖,只需要spring-cloud-starter-consul-discovery

application.properties 配置内容:


server.port=9977

spring.application.name=Consul-Client
spring.cloud.consul.host=192.168.1.100
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.register=false

注意,这里的spring.cloud.consul.discovery.register需要配置成false,否则系统启动的时候,会向consul注册一个服务


package com.pp.client;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConsulClient {

@Autowired
 private LoadBalancerClient loadBalancer;

@Autowired
 private DiscoveryClient discoveryClient;

/**
  * 从所有服务中选择一个服务(轮询)
  */
 @RequestMapping("/discover")
 public Object discover() {
   return loadBalancer.choose("tomcat").getUri().toString();
 }

/**
  * 获取所有服务
  */
 @RequestMapping("/services")
 public Object services() {
   return discoveryClient.getInstances("tomcat");
 }

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

启动之后,就可以访问/discover,/services 查看效果了。

来源:https://blog.csdn.net/mn960mn/article/details/51775212

标签:Spring,Cloud,Consul
0
投稿

猜你喜欢

  • 如何写好一个Spring组件的实现步骤

    2023-01-08 20:24:12
  • 解析SpringBoot中使用LoadTimeWeaving技术实现AOP功能

    2023-04-19 00:21:47
  • 一文带你了解Java万物之基之Object类

    2023-10-09 01:58:28
  • java根据不同的参数调用不同的实现类操作

    2021-11-08 17:05:16
  • Android使用xUtils3.0实现文件上传

    2023-08-04 19:50:02
  • C#中abstract的用法详解

    2021-07-08 21:53:46
  • Springboot集成Spring Security实现JWT认证的步骤详解

    2021-09-18 13:18:08
  • Spring cloud alibaba之Ribbon负载均衡实现方案

    2021-11-08 20:05:23
  • 解读JDK8踩坑JCE加密限制版本问题

    2021-09-20 12:42:35
  • C#实现简化QQ聊天窗口

    2023-01-18 19:01:20
  • Android实现自由拖动并显示文字的悬浮框

    2023-06-08 06:30:39
  • 基于Mybatis映射的一点心得(分享)

    2023-08-08 13:15:53
  • Android 详解沉浸式状态栏的实现流程

    2023-12-18 23:03:31
  • Java对象级别与类级别的同步锁synchronized语法示例

    2023-06-25 09:11:22
  • C#泛型的逆变协变之个人理解

    2021-05-28 16:33:03
  • java selenium 常见web UI 元素操作及API使用

    2021-08-30 00:50:18
  • C#实现俄罗斯方块

    2023-10-29 05:44:27
  • 老生常谈Java String字符串(必看篇)

    2023-06-20 19:56:20
  • Android通过JNI实现守护进程

    2021-11-24 20:38:02
  • Maven Repository仓库的具体使用

    2021-11-04 21:33:34
  • asp之家 软件编程 m.aspxhome.com