SpringCloud使用Consul作为注册中心

一、Consul介绍

consul中文文档:https://www.springcloud.cc/spring-cloud-consul.html
consul官网地址:https://www.consul.io

springcloud方的consul文档:https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/

什么是Consul:

Consul是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。Consul是分布式的、高可用的、 可横向扩展的用于实现分布式系统的服务发现与配置。

Consul 是一个功能齐全的服务网格解决方案,可解决运营微服务和云基础设施的网络和安全挑战。Consul 提供了一种软件驱动的路由和分段方法。它还带来了额外的好处,例如故障处理、重试和网络可观察性。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务网格。

在这里插入图片描述

Consul具有哪些特点:

  • 服务发现(Service Discovery):Consul提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。一些外部的服务通过Consul很容易的找到它所依赖的服务。

  • 健康检查(Health Checking):Consul的Client可以提供任意数量的健康检查,既可以与给定的服务相关联(“webserver是否返回200 OK”),也可以与本地节点相关联(“内存利用率是否低于90%”)。操作员可以使用这些信息来监视集群的健康状况,服务发现组件可以使用这些信息将流量从不健康的主机路由出去。

  • Key/Value存储:应用程序可以根据自己的需要使用Consul提供的Key/Value存储。 Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。

  • 安全服务通信:Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。意图可用于定义允许哪些服务通信。服务分割可以很容易地进行管理,其目的是可以实时更改的,而不是使用复杂的网络拓扑和静态防火墙规则。

  • 多数据中心:Consul支持开箱即用的多数据中心. 这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域。

使用Consul 的优势:

在这里插入图片描述

  • 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接。相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft。

  • 支持多数据中心,内外网的服务采用不同的端口进行监听。多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟,分片等情况等。 zookeeper 和 etcd 均不提供多数据中心功能的支持。

  • 支持健康检查。 etcd 不提供此功能。

  • 支持 http 和 dns 协议接口。 zookeeper 的集成较为复杂, etcd 只支持 http 协议。

  • 官方提供 Web 管理界面, etcd 无此功能。

  • Consul 保持了 CAP 中的 CP,保持了强一致性和分区容错性。

  • Consul 支持 Http\gRPC\DNS 多种访问方式。

在这里插入图片描述

在这里插入图片描述

架构概览:

Consul 是一个分布式系统,旨在运行在节点集群上。节点可以是物理服务器、云实例、虚拟机或容器。连接在一起,Consul 运行的节点集被称为数据中心。
在数据中心内,Consul 可以在服务器或客户端两种模式下运行。服务器代理为 Consul 维护一致的状态。客户端是一个轻量级进程,运行在服务运行的每个节点上。一个数据中心将有 3 - 5 台服务器和许多客户端。

在这里插入图片描述

Consul的使用场景:

Consul的应用场景包括服务发现、服务隔离、服务配置:

  • 服务发现场景中consul作为注册中心,服务地址被注册到consul中以后,可以使用consul提供的dns、http接口查询,consul支持healthcheck。
  • 服务隔离场景中consul支持以服务为单位设置访问策略,能同时支持经典的平台和新兴的平台,支持tls证书分发,service-to-service加密。
  • 服务配置场景中consul提供key-value数据存储功能,并且能将变动迅速地通知出去,借助Consul可以实现配置共享,需要读取配置的服务可以从Consul中读取到准确的配置信息。
  • Consul可以帮助系统管理者更清晰的了解复杂系统内部的系统架构,运维人员可以将Consul看成一种监控软件,也可以看成一种资产(资源)管理系统。

二、安装并运行Consul

在这里插入图片描述

要安装 Consul,请找到官网的软件包并下载。Consul 打包为 zip 存档。linux 使用unzip 进行解压
在这里插入图片描述

windows安装运行Consul:

(1.下载)到官网下载页面:https://www.consul.io/downloads

我们可以下载一个windows和linux版本,可以下载最新用一下,注意和自己的电脑64位/32位匹配。

(2.解压)我们直接在自己本机解压:都是zip压缩包。用解压工具解压后是一个 consul.exe 的执行文件。

(3.运行)cd 到解压后对应的目录下(即consul.exe所在的目录),使用 cmd 启动 Consul:

在这里插入图片描述

运行的启动命令:consul agent -dev #然后回车
#cmd启动(输入): consul agent -dev # -dev表示开发模式运行,另外还有-server表示服务模式运行

为了方便启动,可以在同级目录下创建一个 run.bat 脚本来启动,脚本内容如下:

consul agent -dev

在这里插入图片描述

下次启动的时候直接双击 run.bat 文件即可;当然也可以把 consul 的 exe 文件路径加入到本机的 path 路径下,这样后期只需要在 cmd 命令行下运行.

(4.测试)

在widows启动后如下:
在这里插入图片描述

然后网页测试:输入localhost:8500,就可以看到Consul的管理界面
在这里插入图片描述

当我们看到这个页面后,也就意味着 Consul 已经安装成功了。

linux安装运行Consul

1.下载:
到官网下载页面:https://www.consul.io/downloads

2.解压:

我们可以先将我们的压缩包上传到linux的/usr/consul文件夹下(consul目录自己创建,cd /usr 然后mkdir consul )

使用工具xftp将压缩包上传到/usr/consul:如下
在这里插入图片描述
然后在linux终端台解压:(进入到解压包所在的目录,cd /usr/consul )

unzip consul_1.10.2_linux_amd64.zip
mv consul /usr/local/bin/consul #移动到bin目录,才能算是安装。前一步只能算是解压。

3.检查是否安装成功:

查看consul是否安装成功:

consul --version
或者 consul

4.启动Consul 代理测试:

consul agent -dev //localhost访问
启动consul默认使用dev配置 -client=你的服务器IP:
consul agent -dev -ui -client 192.168.211.211 //IP访问,浏览器输入测试,使用这个,-client后一定是你的linux的ip或者其他

在开发模式下启动 Consul 代理:consul agent -dev

我的linux Ip地址192.168.211.211
./consul agent -dev -ui -node=consul-dev -client=192.168.211.211

为了确保即使服务器出现故障也能保留 Consul 的状态,您应该始终在生产中运行三或五台服务器。奇数个服务器(不超过五个)在性能和容错之间取得平衡。

非服务器代理在客户端模式下运行。客户端是一个轻量级进程,用于注册服务、运行健康检查并将查询转发到服务器。客户端必须运行在 Consul 数据中心中运行服务的每个节点上,因为客户端是服务健康的真实来源。

当您准备好投入生产时,您可以在官网的部署指南 中找到有关服务器和客户端生产部署的更多指南。现在,让我们以开发模式启动我们的本地代理,这是一种内存服务器模式,启用了一些通用功能(尽管存在安全风险)以方便使用,并且所有持久性选项都关闭。

切勿在生产中以-dev模式运行 Consul 。

出现下图内容,则启动成功:
在这里插入图片描述

5.访问测试:
linux版consul网页测试,输入:http://192.168.211.211:8500/

服务器和客户端代理
在生产中,您可以在服务器或客户端模式下运行每个 Consul 代理。每个 Consul 数据中心必须至少有一台服务器,负责维护 Consul 的状态。这包括有关其他 Consul 服务器和客户端的信息,哪些服务可用于发现,以及哪些服务可以与哪些其他服务通信。

向部署好的consul开始注册一个提供者服务:5步走:

(1)创建模块:cloud-providerconsul-payment8006
在这里插入图片描述

(2)pom: 依赖spring-cloud-starter-consul-discovery

<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>
            <version>2.2.2.RELEASE</version>
        </dependency>
        <dependency><!--热部署-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
</dependencies>

在这里插入图片描述
(3)yml:

##consul服务端口
server:
  port: 8006

spring:
  application:
    name: consul-provider-payment
  #consul注册中心地址
  cloud:
    consul:
      host: 192.168.211.211  #consul运行主机的的ip,windows则使用localhost,linux使用linux 的ip
      port: 8500  #consul的端口
      # 服务发现配置
      discovery:
        service-name: ${spring.application.name} # 注册的节点名称
        #hostname  127.0.0.1
        #此处需要设置为true,以IP地址注册到服务中心,不然会报红X,访问不了linux上的consul,显示为localhost本机
        prefer-ip-address: true  #显示ip地址

其他配置项:

server:
  port: 9001
spring:
  application:
    name: service-product
  #consul 信息配置
  cloud:
    consul:
      host: 192.168.17.128 #consul注册中心的ip地址
      port: 8500 #consul注册中心端口
      discovery:
        register: true #是否需要注册
        instance-id: ${spring.application.name}-1 #实例id(唯一标志)
        service-name: ${spring.application.name} #服务的名称
        prefer-ip-address: true #开启ip地址注册
        ip-address: ${spring.cloud.client.ip-address} #当前服务的请求ip
        port: ${server.port} #服务的请求端口

在这里插入图片描述

(4)主启动类:com.fan.springcloud.PaymentMain8006 添加注解@EnableDiscoveryClient。

@EnableDiscoveryClient使应用程序成为Consul的一个“服务”(即把自己注册到注册中心)和一个“客户端”(即可以查询Consul查找其他服务)。

package com.fan.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient//服务发现的客户端
public class PaymentMain8006 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8006.class,args);
    }
}

在这里插入图片描述

linux版consul网页测试:自己的linux 的ip地址:8500
windows版consul网页测试:localhost:8500
这时候可以看到:
在这里插入图片描述

controller: com.fan.springcloud.controller.PaymentController

package com.fan.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;
@RestController
@Slf4j
public class PaymentController {
    @Value("${server.port}")
    private String serverport;

    @RequestMapping("/payment/consul")
    public String paymentConsul(){
        return "springcloud with consul 提供者端口:"+serverport+"\t"+ UUID.randomUUID().toString();
    }
}

在这里插入图片描述
@Value说明:在这里插入图片描述

然后启动8006:
测试:
在这里插入图片描述

linux测试的时候的不同:

linux部署consul的yml不同点:
更多配置项请参考官网:
https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/appendix.html.

技巧:使用360/qq浏览器自带的翻译工具,看中文:
在这里插入图片描述

##consul服务端口
server:
  port: 8006

spring:
  application:
    name: consul-provider-payment
  #consul注册中心地址
  cloud:
    consul:
      host: 192.168.211.211  #consul的ip,在linux中的ip
      port: 8500  #consul的端口
      # 服务发现配置
      discovery:
        service-name: ${spring.application.name} # 注册的节点名称
        #hostname  127.0.0.1
        #此处需要设置为true,以IP地址注册到服务中心,不然会报红X,访问不了linux上的consul,显示为localhost本机
        prefer-ip-address: true

linux端网页测试:

http://192.168.0.106:8006/payment/consul

或者windows版本测试:http://localhost:8006/payment/consul

在这里插入图片描述
linux版本测试结果:
在这里插入图片描述

以下是windows版本部署consul的网页访问:localhost:8006/payment/consul
在这里插入图片描述

同样linux测试成功:
在这里插入图片描述
消费端测试:http://192.168.0.106/consumer/payment/consul
在这里插入图片描述

开始注册服务的消费者:
在这里插入图片描述

(1)创建 消费端 模块 cloud-consumerconsul-order80
在这里插入图片描述
(2)改pom :

<dependencies>
        <!--consul注册中心-->
        <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>
            <version>2.2.2.RELEASE</version>
        </dependency>

        <dependency><!--热部署-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

在这里插入图片描述
(3)写yml:

server:
  port: 80

spring:
  application:
    name: cloud-consumer-order
  #consul注册中心
  cloud:
    consul:
      host: localhost  #consul所在的主机ip
      port: 8500
      discovery:
        #hostname: 127.0.0.1
        service-name: ${spring.application.name}


在这里插入图片描述

(4)主启动类:com.fan.springcloud.OrderConsulMain80

package com.fan.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

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

在这里插入图片描述

配置bean的类:config.ApplicationContextConfig

package com.fan.springcloud.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced //负载均衡的注解
    public RestTemplate getTestTeplate(){
        return new RestTemplate();
    }
}

在这里插入图片描述

controller: controller.OrderConsulController

package com.fan.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@RestController
@Slf4j
public class OrderConsulController {
    //负载均衡使用此服务名来调用 提供者服务
    public static final String INVOKE_URL = "http://consul-provider-payment";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping(value = "/consumer/payment/consul")
    public String paymentInfo(){
        String result = restTemplate.getForObject(
                INVOKE_URL+"/payment/consul",String.class
        );
        return result;
    }
}

在这里插入图片描述

启动消费端80服务:打开网页开服务是否注册进去:
在这里插入图片描述
widows版提供者测试:localhost:8006/payment/consul
在这里插入图片描述

widows版消费端测试:localhost/consumer/payment/consul
在这里插入图片描述

到此我们的两个服务都注册到了consul中。

三、 三种注册中心的比较:

Consul 基于Go语言开发,安装即用。Eureka 为Servlet程序,运行在Servlet容器中。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

四、RestTemplate概述:

spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接, 我们只需要传入url及返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。

在Spring应用程序中访问第三方REST服务与使用Spring RestTemplate类有关。RestTemplate类的设计原则与许多其他Spring *模板类(例如JdbcTemplate、JmsTemplate)相同,为执行复杂任务提供了一种具有默认行为的简化方法。

RestTemplate默认依赖JDK提供http连接的能力(HttpURLConnection),如果有需要的话也可以通过setRequestFactory方法替换为例如 Apache HttpComponents、Netty或OkHttp等其它HTTP library。

考虑到RestTemplate类是为调用REST服务而设计的,因此它的主要方法与REST的基础紧密相连就不足为奇了,后者是HTTP协议的方法:HEAD、GET、POST、PUT、DELETE和OPTIONS。例如,RestTemplate类具有headForHeaders()、getForObject()、postForObject()、put()和delete()等方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值