一、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

一、SpringCloud利用Consul实现服务注册与发现_第1张图片

使用-ui参数启动server成功后,可以在浏览器中输入:http://localhost:8500/ui 看到如下界面
一、SpringCloud利用Consul实现服务注册与发现_第2张图片

二、启动consul client

在本机上启动consul client

consul agent -data-dir /tmp/consul -node=yyh -advertise=192.168.31.188 -join=10.211.55.10
加入server节点成功后的截图如下
一、SpringCloud利用Consul实现服务注册与发现_第3张图片

此时在web ui中查看节点,会发现多了一个节点,但是没有任何服务
一、SpringCloud利用Consul实现服务注册与发现_第4张图片

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

三、注册一个service提供服务

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

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-dependenciesartifactId>
                <version>2.0.0.RELEASEversion>
                <type>pomtype>
                <scope>importscope>
            dependency>

            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>Finchley.M8version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-actuatorartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-actuatorartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-configartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-consulartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-consul-discoveryartifactId>
        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
一、SpringCloud利用Consul实现服务注册与发现_第5张图片
只有当健康检查全部通过,service才能被其他服务正常调用,接下来使用postman这个软件在本地调用服务 http://localhost:8001/hi
一、SpringCloud利用Consul实现服务注册与发现_第6张图片
注意,本例会出现如下情况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 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,发现并未注册新的服务
一、SpringCloud利用Consul实现服务注册与发现_第7张图片

五、后续

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的服务配置中心

你可能感兴趣的:(spring,consul,Spring,Cloud,学习专栏)