一、SpringCloud利用Consul实现服务注册与发现

一、启动consul server

在安装好consul的ubuntu虚拟机上启动consul server,以server方式启动:

consul agent -ui -server -data-dir=/tmp/consul -bootstrap-expect 1 -bind 10.211.55.10

这里写图片描述

使用-ui参数启动server成功后,可以在浏览器中输入:http://localhost:8500/ui 看到如下界面
这里写图片描述

二、启动consul client

在本机上启动consul client

consul agent -data-dir /tmp/consul -node=yyh -advertise=192.168.31.188 -join=10.211.55.10
加入server节点成功后的截图如下
这里写图片描述

此时在web ui中查看节点,会发现多了一个节点,但是没有任何服务
这里写图片描述

如何使用Spring Cloud注册一个服务呢?下面正式开始

三、注册一个service提供服务

1、创建maven项目consulservice1,引入最新的Spring cloud和Spring boot 依赖

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.0.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.M8</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

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

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
    </dependencies>

2、创建服务注册程序

@SpringBootApplication
@EnableDiscoveryClient//此注解将自动发现服务并注册服务
@RestController
public class ConsulService1App {

    @Value("${spring.application.name}")
    private String name;

    @Value("${server.port}")
    private int port;

    @RequestMapping(value = "/hi")
    public String hi(){

        return "hello world ! I'm :" + name + ":" + port;
    }
    public static void main(String[] args){
        SpringApplication.run(ConsulService1App.class, args);
    }
}

application.properties配置,在此处没有进行过于过多的复杂的配置,第二节讲利用consul作为配置中心

spring.application.name=consulservice1
server.port=8001

启动应用程序,当我们在此打开consul web ui 查看我们的service
这里写图片描述
只有当健康检查全部通过,service才能被其他服务正常调用,接下来使用postman这个软件在本地调用服务 http://localhost:8001/hi
这里写图片描述
注意,本例会出现如下情况Could not locate PropertySource: I/O error on GET request 是因为没有配置config server
这里写图片描述

四、发现服务

1、创建项目consulclient1引入module consulservice1同样的依赖
2、applicant.properties中的配置

spring.application.name=consulclient1
server.port=8002

#作用是在自动注册服务
spring.cloud.consul.discovery.register=false

3、创建启动应用程序

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.consul.discovery.ConsulDiscoveryClient;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@SpringBootApplication
@EnableDiscoveryClient
public class ConsulClient1App implements CommandLineRunner{
    @Autowired
    private ConsulDiscoveryClient consulDiscoveryClient;


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

    @Override
    public void run(String... args) throws Exception {
        List<ServiceInstance> serviceInstanceList = consulDiscoveryClient.getInstances("consulservice1");
        ServiceInstance serviceInstance = serviceInstanceList.get(0);
        System.out.println("服务地址:" + serviceInstance.getUri());
        System.out.println("服务名称:" +serviceInstance.getServiceId());

        String callServiceResult = new RestTemplate().getForObject(serviceInstance.getUri().toString()+"/hi",String.class);
        System.out.println(callServiceResult);
    }
}

3、启动应用程序
这里写图片描述
可以成功的看到发现了我们注册的服务consulservice1,同时使用restTemplate调用了consulservice1的接口。
当我在此打开虚拟机上的web ui,发现并未注册新的服务
这里写图片描述

五、后续

1、服务是通过serviceId来发现的,注意它和instanceId的区别,serviceId是服务的名称,instanceId是对服务做另外的标注,作用是在多台服务器上部署相同的服务,instanceId一样的话,服务会被覆盖
2、当缺少依赖的时候会出现各种各样奇怪的错误
3、源码地址:https://github.com/NapWells/spring_cloud_learn/tree/master/discover_server_with_consul/springcloudlearn
4、下一篇,以Consul作为Spring Cloud的服务配置中心

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值