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

1、安装与使用

2、注册服务到consul

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服务

正常即表示启动成功

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-provider
  cloud:
    consul:
      host: localhost
      port: 8500

      discovery:
        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

@RestController
public class ProductController {
    @Autowired
    private ProductService productService;

    @GetMapping("get")
    public Product get(){
        Product products = productService.selectProduct();
        return products;
    }
}

ProductService

public interface ProductService {
    Product selectProduct();
}

ProductServiceImpl

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

Product

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product implements Serializable {

    private Integer id;

    private String productName;

    private Integer productNum;

    private Double productPrice;
}
@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} #服务名称

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

server:
  port: 9090
spring:
  application:
    name: service-consumer
  cloud:
    consul:
      host: localhost
      port: 8500
        
      discovery:
        register: false  #是否需要注册,false不用注册到consul上

OrderController

@RestController
public class OrderController {

    @Autowired
    private OrderService orderService;

    @GetMapping("/{id}")
    public Order selectOrder(@PathVariable("id") Integer id){
        return orderService.selectOrderById(id);
    }

}

OrderService

public interface OrderService {

    Order selectOrderById(Integer id);
}

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

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private RestTemplate restTemplate;


    @Override
    public 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

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Order {

    private Integer id;
    private String orderNo;
    private String orderAddress;
    private Double orderPrice;
    private Product product;
}

Product

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product {

    private Integer id;

    private String productName;

    private Integer productNum;

    private Double productPrice;
}
@SpringBootApplication
public class App {
    public static void main( String[] args ){
        SpringApplication.run(App.class, args);
    }

    //远程调用
    @Bean
    @LoadBalanced
    public 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-provider
  cloud:
    consul:
      host: localhost
      port: 8500

      discovery:
        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      #配置文件格式,这里用的yaml
        profile-separator: "-"  #例如: service-provider和dev中间的符号 用-就是service-provider-dev
        data-key: data    #默认的值就是data  是config的key  写上方便阅读
        prefix: config    #默认的值就是config   是配置的前缀  写上方便阅读
  profiles:
    active: dev

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

打开控制台配置文件新建

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

test.num用来测试动态刷新

重新启动项目

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

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

@RestController
@RefreshScope    //动态刷新获取,如果不加修改获取不到最新的
public class ProductController {

    @Autowired
    private 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的值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/702554.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

bdcn手顺

GitHub链接 https://github.com/pkuCactus/BDCN 环境配置(Prerequisites) Python 3.8 contourpy1.1.1 cycler0.12.1 filelock3.14.0 fonttools4.53.0 fsspec2024.6.0 importlib_resources6.4.0 intel-openmp2021.4.0 Jinja23.1.4 kiwisolver1.4.5 Mark…

扩展方块加载动画

效果图: 完整代码: <!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>扩展方块加载动画</title><style type="text/css">body {background: #ECF0F1;display: flex;justify-content: center;al…

mysql-community-libs-5.7.44-1.el7.x86_64.rpm 的公钥尚未安装

在 CentOS 或 RHEL 系统上安装 RPM 包时&#xff0c;如果遇到“公钥尚未安装”的问题&#xff0c;通常是因为系统没有导入相应的 GPG 公钥。MySQL 官方提供了一个 GPG 公钥&#xff0c;用于验证 RPM 包的签名。 以下是解决该问题的步骤&#xff1a; 下载并导入 MySQL 官方的 GP…

跨境电商中的IP隔离是什么?怎么做?

一、IP地址隔离的概念和原理 当我们谈论 IP 地址隔离时&#xff0c;我们实际上是在讨论一种网络安全策略&#xff0c;旨在通过技术手段将网络划分为不同的区域或子网&#xff0c;每个区域或子网都有自己独特的 IP 地址范围。这种划分使网络管理员可以更精细地控制哪些设备或用…

shell条件测试和if语句

“C:\Users\Jessica\Desktop\6.12.assets\image-20240612094159578.png”# shell条件测试和if语句 一、条件测试 1、$? 返回码 判断命令或者脚本是否执行成功&#xff08;最近的一条&#xff09; 0 true 为真就是成功 成立 非0 false 失败或者异常 2、test命令 可以进行…

Qt程序打包成单个exe文件

文章目录 0. 准备工作1. 使用 windeployqt 提取必要的动态链接库和资源文件1.1 操作步骤1.2 补充 2. 使用 Enigma Virtual Box将文件夹打包成单个exe2.1 操作步骤 0. 准备工作 Qt程序打包用到的工具有&#xff1a; windeployqt &#xff1a;安装Qt时自带Enigma Virtual Box 下…

探索Facebook对世界各地文化的影响

随着数字化时代的到来&#xff0c;社交媒体已成为连接世界各地人们的重要平台之一。而在这个领域的巨头之一&#xff0c;Facebook不仅是人们沟通交流的场所&#xff0c;更是一座桥梁&#xff0c;将不同地域、文化的人们联系在一起。本文将探索Facebook对世界各地文化的影响&…

Alienware外星人X17R2 原装Win11系统镜像下载 带SupportAssist OS Recovery一键恢复

装后恢复到您开箱的体验界面&#xff0c;包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http://w…

Ecovadis认证咨询公司丨ecovadis认证对化学工业产品管理要求

EcoVadis是世界上最值得信赖的全球供应链业务可持续性评级、暂能和协作绩效改进工具提供商。在强大的技术平台和全球领域专家团队的支持下&#xff0c;EcoVadis易于使用和可操作的可持续性记分卡提供了对200多个采购类别和160多个国家/地区的环境、社会和道德风险的详细洞察。 …

一个小的画布Canvas页面,记录点的轨迹

Hello大家好&#xff0c;好久没有更新了&#xff0c;最近在忙一些其他的事&#xff0c;今天说一下画布canvas&#xff0c;下面是我的代码&#xff0c;实现了一个点从画布的&#xff08;0,0&#xff09;到&#xff08;canvas.width&#xff0c;canvas.height&#xff09;的一个实…

【iOS】UI学习——界面切换

界面切换 push和poppresent和dismiss示例程序 push和pop 在 Objective-C 中,pop 和 push 通常是与 UINavigationController 一起使用的方法,用于控制导航栈中视图控制器的跳转和回退。 push 和 pop 通常成对使用,用于实现导航栈的前进和后退功能。当用户进入新的视图控制器时…

一种新的一维时间序列信号盲解卷积算法(以旋转机械故障诊断为例,MATLAB环境)

一种新的一维时间序列信号盲解卷积算法&#xff08;以旋转机械故障诊断为例&#xff0c;MATLAB环境&#xff09;&#xff0c;可作为深度学习信号前处理过程&#xff0c;水个SCI不是问题。 机械设备的状态信号中往往蕴含着大量的设备异常信息。如何从繁多的机械状态信号中提取足…

C++ 10 之 引用

c10引用.cpp #include <iostream>using namespace std;int main() {// 引用的语法&#xff1a;类型 &别名 原名// int a 10;// int &b a; // 此时a,b指向同一块内存// cout << "a: " << a << endl;// cout << "b: &…

【机器学习】GANs网络在图像和视频技术中的应用前景

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 1. &#x1f525;引言 背景介绍 研究意义 2. &#x1f388;GANs的基本概念和工作原理 生成对抗网络简介 工作原理 3. &#x1f916;GANs在图像生成中的应用 图像超分辨率 工作原理 图像去噪 工作原理 图…

java基于Vue+Spring boot前后端分离架构开发的一套UWB技术高精度定位系统源码

java基于VueSpring boot前后端分离架构开发的一套UWB技术高精度定位系统源码 系统采用UWB高精度定位技术&#xff0c;可实现厘米级别定位。UWB作为一种高速率、低功耗、高容量的新兴无线局域定位技术&#xff0c;目前应用主要聚焦在室内外精确定位。在工业自动化、物流仓储、电…

每日5题Day22 - LeetCode 106 - 110

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;106. 从中序与后序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09; class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {…

航班进出港管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;航班信息管理&#xff0c;航飞降落请求管理&#xff0c;公告信息管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;公告信息&a…

改进YOLOv8 | 主干网络篇 | YOLOv8 更换主干网络之 StarNet | 《重写星辰⭐》

本改进已集成到 YOLOv8-Magic 框架。 论文地址:https://arxiv.org/abs/2403.19967 论文代码:https://github.com/ma-xu/Rewrite-the-Stars 最近的研究引起了人们对“星形运算”(按元素乘法)在网络设计中未被充分利用的潜力的关注。虽然直观的解释很多,但其应用的基本原理…

C# WinForm ——31 32 Menustrip菜单栏

1. 介绍 菜单控件&#xff0c;包含多个菜单项的菜单容器 主菜单下面可以有子菜单&#xff0c;子菜单下面可以有下一级子菜单 2. 常用属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到Enabled控件是否启用Dock定义要绑定到容器的控件边框&#xff0c;默认是t…

IDEA配置mybatis-config.xml模板文件

IDEA配置mybatis-config.xml模板文件 File>>Settings>>File and Code Templates 创建mybatis-config.xml模板 模板内容取自mybatis官网 mybatis官网 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configurationPUBLIC &qu…