入门Consul注册、配置中心(代码演示)

news/2024/9/23 3:14:34/

1、安装与使用

consul-toc" style="margin-left:0px;">2、注册服务到consul

consul%E4%B8%8A%E6%B3%A8%E5%86%8C%E7%9A%84%E6%9C%8D%E5%8A%A1-toc" style="margin-left:0px;">3、调用consul上注册的服务

4、配置中心

1、安装与使用

官网地址:Install | Consul | HashiCorp Developer

下载对应的系统

解压缩后文件

打开命令行运行

consul.exe agent -dev

即可运行

可以编写一个bat脚本每次运行bat脚本就行,就不用每次cmd敲命令行了

@echo off  start "" "F:\tool\consul_1.18.2_windows_amd64\consul.exe" agent -dev记得将路径改为自己的

运行成功后访问可视化控制台地址:localhost:8500

一个实例就是当前的consul服务

正常即表示启动成功

consul">2、注册服务到consul

新建一个maven项目,父项目导入依赖(依赖版本注意对应关系,cloud和springboot版本需对应)

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.4.RELEASE</version>
</parent>
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR1</version><type>pom</type><scope>import</scope></dependency>
</dependencies>

新建子项目service-provider

导入依赖

    <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId><version>2.2.1.RELEASE</version></dependency><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>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>

配置application.yml文件

spring:application:name: service-providercloud:consul:host: localhostport: 8500discovery:register: true  #是否需要注册instance-id: ${spring.application.name}-01 #实例名称(必须唯一)service-name: ${spring.application.name} #服务名称port: ${server.port}  #服务端口prefer-ip-address: true #是否使用ip注册服务ip-address: ${spring.cloud.client.ip-address} #请求服务ip地址
server:port: 7070

ProductController

java">@RestController
public class ProductController {@Autowiredprivate ProductService productService;@GetMapping("get")public Product get(){Product products = productService.selectProduct();return products;}
}

ProductService

java">public interface ProductService {Product selectProduct();
}

ProductServiceImpl

java">@Service
public class ProductServiceImpl implements ProductService {@Overridepublic Product selectProduct() {return new Product(1,"手机",200,1999.0);}
}

Product

java">@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product implements Serializable {private Integer id;private String productName;private Integer productNum;private Double productPrice;
}
java">@SpringBootApplication
public class ProviderApplication {public static void main( String[] args ){SpringApplication.run(ProviderApplication.class, args);}
}

启动项目   访问测试接口成功

 启动成功后查看localhost:8500

这个就是我们配置的。点进去service-provider-01是我们配置的instance-id

service-name: ${spring.application.name} #服务名称

consul%E4%B8%8A%E6%B3%A8%E5%86%8C%E7%9A%84%E6%9C%8D%E5%8A%A1" style="background-color:transparent;">3、调用consul上注册的服务

在第二步我们将service-provider注册到了consul上,接下来我们写个模块来调用他

新建service-consumer模块

pom.xml

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId><version>2.2.1.RELEASE</version></dependency><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>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>

application.yml

java">server:port: 9090
spring:application:name: service-consumercloud:consul:host: localhostport: 8500discovery:register: false  #是否需要注册,false不用注册到consul

OrderController

java">@RestController
public class OrderController {@Autowiredprivate OrderService orderService;@GetMapping("/{id}")public Order selectOrder(@PathVariable("id") Integer id){return orderService.selectOrderById(id);}}

OrderService

java">public interface OrderService {Order selectOrderById(Integer id);
}

OrderServiceImpl(调用地址:http://service-provider/get)

java">@Service
public class OrderServiceImpl implements OrderService {@Autowiredprivate RestTemplate restTemplate;@Overridepublic Order selectOrderById(Integer id) {return new Order(id, "order-001", "中国", 100D,selectProductListByLoadBalancer());}//发起请求去调用service-provider模块private Product selectProductListByLoadBalancer(){ResponseEntity<Product> response = restTemplate.exchange("http://service-provider/get",HttpMethod.GET,null,new ParameterizedTypeReference<Product>() {});Product body = response.getBody();return body;}
}

Order

java">@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order {private Integer id;private String orderNo;private String orderAddress;private Double orderPrice;private Product product;
}

Product

java">@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product {private Integer id;private String productName;private Integer productNum;private Double productPrice;
}
java">@SpringBootApplication
public class App {public static void main( String[] args ){SpringApplication.run(App.class, args);}//远程调用@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}

启动项目  访问localhost:9090/1        测试一下

我们可以看到通过调用http://service-provider/get已经成功获取到了数据

4、配置中心

我们用service-provider模块举例        (测试从consul上获取端口和自定义参数)

给service-provider模块新加两个依赖(consul配置中心和bootstrap的读取)

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-config</artifactId><version>2.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>3.1.3</version></dependency>

将之前的application.yml改为bootstrap.yml。因为bootstrap优先级比application高

bootstrap.yml

spring:application:name: service-providercloud:consul:host: localhostport: 8500discovery:register: true  #是否需要注册instance-id: ${spring.application.name}-01 #实例名称(必须唯一)service-name: ${spring.application.name} #服务名称port: ${server.port}  #服务端口prefer-ip-address: true #是否使用ip注册服务ip-address: ${spring.cloud.client.ip-address} #请求服务ip地址config:enabled: true     #是否开启配置中心format: yaml      #配置文件格式,这里用的yamlprofile-separator: "-"  #例如: service-provider和dev中间的符号 用-就是service-provider-devdata-key: data    #默认的值就是data  是config的key  写上方便阅读prefix: config    #默认的值就是config   是配置的前缀  写上方便阅读profiles:active: dev

我们没有配置这个项目的端口号,从consul上获取

打开控制台配置文件新建

为啥这样命名?因为consul中默认前缀就是config,默认后面的key就是data。得加

test.num用来测试动态刷新

重新启动项目

可以看到使用7070端口启动,成功从consul上获取到了端口

我们再来测试一下动态获取配置数据

java">@RestController
@RefreshScope    //动态刷新获取,如果不加修改获取不到最新的
public class ProductController {@Autowiredprivate ProductService productService;//获取测试的数据@Value("${test.num}")private String num;@GetMapping("get")public Product get(){Product products = productService.selectProduct();return products;}//测试的方法@GetMapping("test")public String test(){return num;}
}

重新启动  调用localhost:7070/test

获取成功,测试动态获取                修改num的值


http://www.ppmy.cn/news/1468915.html

相关文章

程序员应该有什么职业素养?

作为一名程序员&#xff0c;职业素养不仅决定了个人的职业发展&#xff0c;也直接影响到团队协作和项目的成功。那么&#xff0c;程序员在职业生涯中应具备哪些职业素养呢&#xff1f;本文将从三个主要方向进行探讨&#xff1a;专业精神、沟通能力和持续学习。这些素养不仅是程…

【iOS】UI学习——UITableView

UI学习&#xff08;四&#xff09; UITableView基础UITableView协议UITableView高级协议和单元格 UITableView基础 dateSource:数据代理对象 delegate:普通代理对象 numberOfSectionInTableView:获得组数协议 numberOfRowsInSection:获得行数协议 cellForRowAtIndexPath:创建单…

$MPC 登录MEXC,加速Partisia Blockchain 生态市场进程

Partisia Blockchain 是一个以 MPC 技术方案为基础&#xff0c;具备可审计特性的隐私 Layer1 生态&#xff0c;与此同时&#xff0c;该链通过系列创新的系统架构&#xff0c;能够兼顾高迸发、安全、可拓展性以及可互操作特性。基于系列技术特性&#xff0c;Partisia Blockchain…

【算法系列 | 13】深入解析查找算法之—树表查找

引言 查找算法在计算机科学中扮演着至关重要的角色。它们的效率直接影响到系统的性能和用户体验。树表查找&#xff08;Tree-based Search&#xff09;是一类基于树结构的查找算法&#xff0c;广泛应用于各类数据结构和数据库系统中。 本文将深入介绍树表查找算法的原理、优缺点…

6月11号作业

思维导图 #include <iostream> using namespace std; class Animal { private:string name; public:Animal(){}Animal(string name):name(name){//cout << "Animal&#xff1b;有参" << endl;}virtual void perform(){cout << "讲解员的…

vue2 element组件兼容性问题

1.el-select 聚焦问题 点两次才可以选择选项 <el-select name"XXX" v-model"form.XXX" clearable style"width: 100%":popper-append-to-body"false" popper-class"popper-select-class"change"XXX"><…

..\USER\stm32f10x.h(298): error: #67: expected a “}“

原keil4的示例工程在用keil5打开之后出现报错&#xff1a; ..\USER\stm32f10x.h(298): error: #67: expected a "}" 在去掉手动添加的一个宏定义STM32F10X_HD后即可正常编译&#xff0c;因为KEIL5已经自动添加了

nginx mirror流量镜像详细介绍以及实战示例

nginx mirror流量镜像详细介绍以及实战示例 1.nginx mirror作用2.nginx安装3.修改配置3.1.nginx.conf3.2.conf.d目录下添加default.conf配置文件3.3.nginx配置注意事项3.3.nginx重启 4.测试 1.nginx mirror作用 为了便于排查问题&#xff0c;可能希望线上的请求能够同步到测试…