Springcloud注册中心之Consul

介绍

在Springcloud中目前常用的注册中心组建有3个,Eureka前面我们已经介绍过了,这篇文章我们介绍Consul。Consul是HashiCorp公司推出来的开源产品。主要提供了:服务发现、服务隔离、服务配置等功能。相比于Eureka和Zookeeper,Consul配置更加一站式,因为内置了很多微服务常见的需求:服务发现与注册、分布式一致性协议实现、健康检查、键值对储存、多数据中心等,我们不需要借助第三方组件实现这些功能。

安装

不同与Eureka,Consul使用Go语言开发,所以,使用Consul,我们需要安装软件。我们这里安装采用Linux。Windows安装相对简单下载地址,下载安装即可。

1.执行下面命令下载
wget https://releases.hashicorp.com/consul/1.7.2/consul_1.7.2_linux_amd64.zip
2.解压
unzip consul_1.7.2_linux_amd64.zip
3.启动
./consul agent -dev -ui -node=consul-dev -client=0.0.0.0

注意:如果是服务器需要在安全组里开启端口8500,不然访问不到。

6.输入http://ip:8500访问

在这里插入图片描述

使用

服务提供者

创建一个springboot项目

1.依赖pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dpf</groupId>
    <artifactId>consul-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>consul-provider</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
    </properties>

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.启动类添加注解
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulProviderApplication {

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

}
3.配置application.yml
spring:
  application:
    name: consul-provider
  cloud:
    consul:
      host: 你的consul安装的地址,本地填写localhost
      port: 8500
      discovery:
        service-name: consul-provider
        
server:
  port: 2000
  • spring.cloud.consul.host:安装consul的主机地址
  • spring.cloud.consul.port:consul端口号默认为8500
  • spring.cloud.consul.discovery.service-name:注册到consul的服务名称,后期客户端会根据这个名称来进行服务调用。
  • spring.cloud.consul.discovery.register=false 不注册到consul中。客户端可以设置注册到 Consul 中,也可以不注册到 Consul 注册中心中,根据我们的业务来选择,只需要在使用服务时通过 Consul 对外提供的接口获取服务信息即可。
4.controller
@RestController
public class HelloController {

    @Value("${server.port}")
    Integer port;
    @GetMapping("/hello")
    public String hello(){
        return "hello"+port;
    }
}
5.集群注册

将该项目打包,打包成功后执行如下命令

java -jar consul-provider-0.0.1-SNAPSHOT.jar --server.port=2000
java -jar consul-provider-0.0.1-SNAPSHOT.jar --server.port=2001

启动成功后,再去consul页面就可以看到两个实例了

服务消费者

1.依赖pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dpf</groupId>
    <artifactId>consul-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>consul-consumer</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.启动类添加注解
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulConsumerApplication {

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

    /**
     * 用于服务间调用
     * @return
     */
    @Bean
    RestTemplate restTemplate(){
        return new RestTemplate();
    }

}
3.配置application.yml
spring:
  application:
    name: consul-consumer

  cloud:
    consul:
      host: consul安装的ip
      port: 8500
      discovery:
        service-name: consul-consumer
server:
  port: 2003
4.controller
@RestController
public class HelloController {

    @Autowired
    LoadBalancerClient loadBalancerClient;
    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/hello")
    public void hello(){
        
        ServiceInstance choose = loadBalancerClient.choose("consul-provider");
        System.out.println(choose);
        System.out.println(choose.getUri());
        System.out.println(choose.getHost());
        String forObject = restTemplate.getForObject(choose.getUri() + "/hello", String.class);
        System.out.println(forObject);
    }

}
5.启动测试
原创文章 139 获赞 52 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_41262903/article/details/105199197