SpringCloud实战---第十一篇:使用Consul服务注册中心
前言
说起来容易做起来难,一步一步都干完!!!
学习一定要自己动手搞一搞,不能只眼会。
学习笔记是跟着尚硅谷的视频学的:https://www.bilibili.com/video/BV18E411x7eT?p=1
场景大纲
我们以这样一个场景来学习、构建我们的微服务,可以看到,使用Consule做注册中心也是只需要改变注册中心的选型即可。
关于Consul
- 是一套开源的分布式服务发现和配置管理系统
- 用Go语言开发的
- consul自带web图形化界面
- consul官网 https://www.consul.io/
- consul入门中文网址: https://www.springcloud.cc/spring-cloud-consul.html
- 如果不使用nacos,consul将是Eureka的最佳替换方案
- consul安装十分简单,傻瓜式安装
安装
1. 下载安装包
从官网下载安装包,我们学习用的,下个Windows x 64的即可
下载的慢,抽个烟,发会呆。。。。。。
官网下载太慢,学习时下载我百度网盘上的吧。。。
链接:https://pan.baidu.com/s/1xbe2JcvQEtko7Eb4MUXnBQ
提取码:5ixl
2. 官网安装说明(动画片,很简单,需要自己看): https://learn.hashicorp.com/consul/getting-started/install.html
3. 启动
下载完成后解压,在解压目录上输入cmd,回车进入小黑窗口
执行命令,以开发模式启动
consul agent -dev
4. 访问localhost:8500,可以看到consul注册中心的web页面
5. 关闭Consul关掉cmd窗口即可
服务提供者模块cloud-providerconsul-payment8006
1. 创建子模块
cloud-providerconsul-payment8006
2. 添加POM依赖
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud2021</artifactId>
<groupId>com.atguigu.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-providerconsul-payment8006</artifactId>
<dependencies>
<!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!--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>
<!--日常通用jar包配置-->
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3. 添加applicaiton.yml
###consul服务端口号
server:
port: 8006
spring:
application:
name: consul-provider-payment
####consul注册中心地址
cloud:
consul:
host: localhost
port: 8500
discovery:
#hostname: 127.0.0.1
service-name: ${spring.application.name}
4. 编写启动类
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @Author: Daisen.Z
* @Date: 2021/12/22 16:40
* @Version: 1.0
* @Description:
*/
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8006 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8006.class,args);
}
}
5. 编写Controller
package com.atguigu.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: Daisen.Z
* @Date: 2021/12/22 16:42
* @Version: 1.0
* @Description:
*/
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/consul")
public String paymentConsul(){
return "consul service port:"+serverPort;
}
}
6. 验证测试
启动8006
查看consul页面,服务已经注册进来
可以一步步点击consul-provider-payment,查看详细信息
服务消费者模块cloud-custonconsul-order80
1. 创建模块
cloud-custonconsul-order80
2. 添加POM依赖
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud2021</artifactId>
<groupId>com.atguigu.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-custonconsul-order80</artifactId>
<dependencies>
<!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!--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>
<!--日常通用jar包配置-->
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3. 添加applicstion.yml
###consul服务端口号
server:
port: 80
spring:
application:
name: consul-customer-payment
####consul注册中心地址
cloud:
consul:
host: localhost
port: 8500
discovery:
#hostname: 127.0.0.1
service-name: ${spring.application.name}
4. 添加启动类
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @Author: Daisen.Z
* @Date: 2021/12/22 16:57
* @Version: 1.0
* @Description:
*/
@SpringBootApplication
@EnableDiscoveryClient
public class OrderConsulMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderConsulMain80.class, args);
}
}
5. 将zk80工程的config和controller搞过来
注意:这里controller调用的是另一个微服务cloud-provider-payment的接口
多自己操作,提高下搞代码的速度,实在懒得不行直接粘贴下面的吧就~~
package com.atguigu.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;
/**
* @auther zzyy
* @create 2020-02-19 15:21
*/
@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;
}
}
6. 启动测试
先启动8006,再启动consul80
访问localhost:8500
两个服务都注册上来了
使用80调用8006微服务
http://localhost/consumer/payment/consul
完美~~~
Eureka、Zookeeper、Consul的对比
之前几篇提到的CAP介绍
C:Consistency(强一致性)
A: Availability(可用性)
P: Partition tolerance(分区容错性)
CAP理论关注粒度是数据(我们这里就是微服务信息),而不是整体系统设计的策略
AP(Eureka): AP架构当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性。结论:违背了一致性C的要求,只满足可用性和分区容错,即AP(保障健康的服务,允许心跳停止的服务继续存在)。
CP(Zookeeper/Consul): CP架构当网络分区出现后,为了保证一致性,就必须拒接请求,否则无法保证一致性结论:违背了可用性A的要求,只满足一致性和分区容错,即CP (保障服务一致,发现心跳停止的服务立即干掉)。
这里的存在和干掉,操作的都是注册中心的注册表(zk下是文件形式存储的,Eureka和Consul下是KV形式存储的)。
总结
- consul官网 https://www.consul.io/
- consul开发模式启动命令consul agent -dev
- consul的web页面端口8500
- 如果没有nacos,consul会是替代Eureka的最优选择
- consul和zookeeper做注册中心一样,也是CP
- CPA是软件架构的三大诉求,不能同时满足(是自相矛盾的),只能根据场景牺牲某一方保障另外的两个。
- 点赞
- 收藏
- 关注作者
评论(0)