使用Consul替换Eureka

本文介绍了由于Eureka闭源,选择Consul作为替代方案进行服务发现的过程。首先,概述了Consul的基本特性,接着演示了如何启动Consul的开发服务器模式,并通过UI界面验证其正常运行。然后,创建了一个Maven项目并配置相关注解,成功将服务注册到Consul。最后,通过新建另一个Maven项目并调整配置,展示了多个服务在Consul中的注册和交互,实现了类似Eureka的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Consul简介

之所以我们要替换掉eureka,因为eureka闭源了,所以使用开源工具去替换它
Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。下载Consul地址
解压,记住路径,进入cmd命令行,输入命令
consul agent -dev -ui -node=zgq
-dev开发服务器模式启动,
-node结点名为zgq,
-ui可以用界面访问,默认能访问
默认访问http://localhost:8500,看见下面的界面就成功启动了
在这里插入图片描述

新建maven项目

新建consul_member项目,添加注解

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
    </parent>
    <!-- 管理依赖 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.M7</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--SpringCloud consul-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.40</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

    </dependencies>
    <!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

添加配置文件

###eureka 服务端口号
server:
  # member8504
  port: 8504
  # order8505
  #port: 8505
spring:
  application:
    name: consul-member
    #name: consul-member
  ####consul注册中心地址
  cloud:
    consul:
      host: 127.0.0.1
      port: 8500
      discovery:
        hostname: 127.0.0.1

新建启动类,我就不写了,然后启动,再查看consul服务,注入成功
新建maven项目consul_order,将上面的依赖加入,配置文件的端口号改成8505,启动,就可看见注入成功
查看consul的控制台,即可看见都注入成功
在这里插入图片描述
在member中新建UserController

@RestController
@RequestMapping(value = "/user")
public class UserController {


    @RequestMapping("/get")
    public String getUser() {
        return "8504 member controller getuser";
    }
}

在order中新建OrderController


@RestController
public class OrderController {

	@Autowired
	private RestTemplate restTemplate;
	@Autowired
	private DiscoveryClient discoveryClient;

	// 获取已经注册的服务
	@RequestMapping("/getServices")
	public List<String> getServices() {
		List<String> services = discoveryClient.getServices();
		return services;
	}

	// 获取服务的集群信息
	@RequestMapping("/getServiceUrlList")
	public List<String> getServiceUrlList(String name) {
		List<ServiceInstance> list = discoveryClient.getInstances(name);
		List<String> services = new ArrayList<>();
		for (ServiceInstance serviceInstance : list) {
			if (serviceInstance != null) {
				services.add(serviceInstance.getUri().toString());
			}
		}
		return services;
	}

	// 调用Member服务
	@RequestMapping("/order")
	public String order() throws Exception {
		// 有两种方式,一种是采用服务别名方式调用,另一种是直接调用 使用别名去注册中心上获取对应的服务调用地址
		String serviceUrl = getServiceUrl("consul-member") + "/user/get";
		System.out.println(serviceUrl);
		String result = (String) restTemplate.getForObject(serviceUrl, String.class);
		System.out.println("订单服务调用会员服务result:" + result);
		return result;
	}

	// 取得一个服务地址
	protected String getServiceUrl(String name) {
		List<ServiceInstance> list = discoveryClient.getInstances(name);
		if (list != null && !list.isEmpty()) {
			return list.get(0).getUri().toString();
		}
		return null;
	}

当我们调用order层的getServices方法和getServiceUrlList方法时,达到了和eureka相同的效果!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值