irpas技术客

SpringCloud实战---第十一篇:使用Consul服务注册中心_小张敲代码

irpas 507

前言 说起来容易做起来难,一步一步都干完!!! 学习一定要自己动手搞一搞,不能只眼会。 学习笔记是跟着尚硅谷的视频学的:https://·/video/BV18E411x7eT?p=1 场景大纲

我们以这样一个场景来学习、构建我们的微服务,可以看到,使用Consule做注册中心也是只需要改变注册中心的选型即可。


关于Consul 是一套开源的分布式服务发现和配置管理系统用Go语言开发的consul自带web图形化界面consul官网 https://·/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 -devconsul的web页面端口8500如果没有nacos,consul会是替代Eureka的最优选择consul和zookeeper做注册中心一样,也是CPCPA是软件架构的三大诉求,不能同时满足(是自相矛盾的),只能根据场景牺牲某一方保障另外的两个。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。