一、consul作为注册中心

eureka现在已经不更新,上篇博客中我们讲解了zookeeper作为注册中心的解决方案,除了zk还有consul也可以作为注册中心来使用,并且consul所支持的功能是多余eureka和zk 的,可以说如果没有nacos的出现,consul很有可能成为现在的主流。


二、consul 安装

Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。

提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。

它具有很多优点。包括: 基于 raft 协议,比较简洁; 支持健康检查, 同时支持 HTTP 和 DNS 协议 支持跨数据中心的 WAN 集群 提供图形界面 跨平台,支持 Linux、Mac、Windows。

consul 的下载地址

https://www.consul.io/downloads

spring cloud 集群模式_spring cloud


这里可以先选windows版本进行测试,linux版本,官方也给出了安装步骤。windows版下载好之后,只有一个 consul.exe ,使用consul agent -dev就可以启动consul服务,我们也可以编写一个启动脚本,放在 consul.exe同级目录中,来方便我们进行测试:

start.bat

consul agent -dev
pause

启动后,可以在浏览器中输入 http://127.0.0.1:8500/ 来查看consul 的可视化页面

spring cloud 集群模式_spring cloud 集群模式_02


至此,consul服务就已经准备好了

三、声明SpringCloud版本

还是和上篇文章中讲的一样,在父pom,或者自己的boot项目中声明出SpringCloud的版本:

版本我们采用H版的SR9版本

<?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>
    <groupId>com.bxc</groupId>
    <artifactId>cloud-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cloud-parent</name>
    <packaging>pom</packaging>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
        <model.version>0.0.1-SNAPSHOT</model.version>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</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>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>

    </dependencies>

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

            <!--spring cloud Hoxton.SR9-->
            <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.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.bxc.clouddemo.CloudDemoApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

四、服务提供者修改

在pom中引入依赖:

<!--SpringCloud consul-server -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!-- SpringBoot整合Web组件 -->
<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>com.bxc</groupId>
    <artifactId>common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

common是我们上篇博客中讲到的公共的module,大家可以参考上篇博客,也可以不依赖,将controller的返回修改为自定义的即可。

修改配置文件:

server:
  port: 8091

spring:
  application:
    name: provider
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        #hostname: 127.0.0.1
        service-name: ${spring.application.name}

主启动类修改:

@SpringBootApplication
@EnableDiscoveryClient
public class ZkProvider2Application {
    public static void main(String[] args) {
        SpringApplication.run(ZkProvider2Application.class, args);
    }
}

启动服务提供者,查看consul 可视化页面:

spring cloud 集群模式_consul_03

可以看出服务信息,已经存储在了consul中,此时切换一个端口,再启动一个提供者,在查看consul可视化页面:

spring cloud 集群模式_微服务_04


spring cloud 集群模式_consul_05

provider节点下,就出现两个信息了。

最后编写提供者提供的服务接口:

@RestController
public class ProviderController {

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

    @GetMapping("/getData")
    public ResponseTemplate providerData() {

        return ResSuccessTemplate.builder().data("come from : " + port).build();
    }

    @GetMapping("/getTimeData")
    public ResponseTemplate getTimeData() throws InterruptedException {
        TimeUnit.SECONDS.sleep(5);
        return ResSuccessTemplate.builder().data("come from : " + port).build();
    }

}

四、服务消费者修改

消费者端的pom和配置和提供者相同,可以完全拷贝过来,将端口改为8080,在消费端,我们还是采用ribbon + restTemplate 的方式进行演示,后面我们会讲解feign的具体使用。

声明 RestTemplate

@Configuration
public class RestTemplateConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

编写测试接口

@RestController
@RequestMapping("/rest/consumer")
public class ConsumerController {
    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/getData")
    public ResponseTemplate getData() {
        ResponseTemplate responseTemplate = restTemplate.getForObject("http://provider/getData", ResSuccessTemplate.class);
        return responseTemplate;
    }

    @GetMapping("/getTimeData")
    public ResponseTemplate getTimeData() {
        ResponseTemplate responseTemplate = restTemplate.getForObject("http://provider/getTimeData", ResSuccessTemplate.class);
        return responseTemplate;
    }

}

接口测试,在浏览器输入:http://localhost:8080/rest/consumer/getData

spring cloud 集群模式_spring_06


spring cloud 集群模式_spring_07


已经实现和Eureka和zookeeper相同的效果,但也只修改了少量的配置。