【微服务】服务注册与发现、分布式配置管理 - Consul(day5)

概述

作用

Consul的两大作用就是服务发现和注册分布式配置管理

服务发现在介绍Eureka组件的时候已经进行过详细概述,大概就是将硬编码到服务中的IP地址和端口号进行解耦,从而实现动态扩缩容、容错处理、服务管理等功能,通过服务注册和发现实现的微服务代码就是俩字:太优雅了。

分布式配置管理的意思是将原先配置到项目中的配置信息配置到远程服务器上。原因是因为微服务将应用拆分成了粒度较小的子服务,因此系统中会出现大量的服务,而每个服务都需要必要的配置信息才能运行,所以会出现大量的配置文件。综上所述,一套集中式的、动态的配置管理设施是必不可少的。比如某些配置文件中的内容大部分是相同的,只有极个别是不同的。就拿数据库来说吧,如果每个微服务使用的技术栈相同,则每个微服务关于数据库的配置几乎是相同的,有时候主机迁移了,我希望一次修改、处处生效。对于原先的配置文件来说,就需要重新配置、重新打包上线。但是如果使用了分布式配置管理,那么就可以在远程进行修改,并且,有的分布式配置中心还能共享一套配置文件,这样更进一步减少了运维人员的工作量。

功能

服务发现

健康检测

KV存储

多数据中心

可视化Web界面

安装Consul

1. 访问官网进行下载,如下图:

 2. 查看版本:consul -version。下载好就是一个exe文件,通过cmd命令进行下载好的目录,输入上述命令即可查看版本。

 3. 启动Consul:consul agent -dev,依旧是下载好的exe文件对应的目录,直接运行上述命令即可启动Consul。

4. 查看Consul:127.0.0.1:8500,输入网址即可看到Consul的网站。

服务注册与发现

为了后续方便上传码云和复习,因此将学习Eureka和SpringCloudLoadBalancer的模块全部进行改名,并且学习Consul时新建立模块,不和前面的模块进行耦合。

搭建商品服务

建模块

写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"><modelVersion>4.0.0</modelVersion><parent><groupId>com.wbz</groupId><artifactId>spring-cloud-test</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>cloud-consumer-order-consul-81</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--SpringBoot通用模块--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--Lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--Druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId></dependency><!--MySQL驱动--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!--MP--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId></dependency><!--Consul--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

新增的依赖就是Consul的依赖:

        <!--Consul--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency>

写yml文件

server:port: 81spring:application:name: cloud-consumer-order-consul-81mvc:pathmatch:matching-strategy: ant_path_matcher # 路径匹配策略datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_order?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=trueusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverprofiles:active: devcloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}mybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:mapper/**Mapper.xmltype-aliases-package: com.wbz.domain

新增的yml文件就是配置Consul需要的配置文件:

spring:cloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}

改启动类

/*** consul组件的被调用方启动类*/@EnableDiscoveryClient // 服务注册
@MapperScan("com.wbz.mapper")
@SpringBootApplication
public class ProductProviderApplicationConsul8101 {public static void main(String[] args) {SpringApplication.run(ProductProviderApplicationConsul8101.class, args);}}

新增的内容就是@EnableDiscoveryClient注解,用来进行服务注册的。 

写业务类

// model
/*** 产品表*/@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("product_detail")
public class Product {@TableIdprivate Long id;@TableFieldprivate String productName;@TableFieldprivate Long productPrice;@TableFieldprivate Integer state;@TableField@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private LocalDateTime createTime;@TableField@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private LocalDateTime updateTime;}// 持久层接口
public interface ProduceMapper extends BaseMapper<Product> {
}// 服务层接口
public interface ProductService extends IService<Product> {Product getProductById(Long productId);}// 服务层实现类
@Service
public class ProductServiceImpl extends ServiceImpl<ProduceMapper, Product> implements ProductService {@Overridepublic Product getProductById(Long productId) {return this.getById(productId);}}// 控制层类
@RestController
@RequestMapping("/product")
public class ProductController {@Resourceprivate ProductService productService;@GetMapping("/query/{productId}")public Product getProductById(@PathVariable Long productId) {return this.productService.getProductById(productId);}}

启动项目之后,出现如下界面就表示商品服务依旧注册到注册中心了:

搭建订单服务

建模块

写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"><modelVersion>4.0.0</modelVersion><parent><groupId>com.wbz</groupId><artifactId>spring-cloud-test</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>cloud-consumer-order-consul-81</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--SpringBoot通用模块--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--Lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--Druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId></dependency><!--MySQL驱动--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!--MP--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId></dependency><!--Consul--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

pom文件中新增的就是Consul的依赖:

        <!--Consul--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency>

写yml文件

server:port: 81spring:application:name: cloud-consumer-order-consul-81mvc:pathmatch:matching-strategy: ant_path_matcher # 路径匹配策略datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_order?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=trueusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverprofiles:active: devcloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}mybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:mapper/**Mapper.xmltype-aliases-package: com.wbz.domain

新增的pom依赖就是配置Consul的内容:

spring:cloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}

写主启动类

@MapperScan("com.wbz.mapper")
@EnableDiscoveryClient // 服务注册
@SpringBootApplication
public class OrderConsumerApplicationConsul81 {public static void main(String[] args) {SpringApplication.run(OrderConsumerApplicationConsul81.class, args);}}

 新增的内容就是@EnableDiscoveryClient注解,用来进行服务注册的。 

写业务类

// JavaBean
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("order_detail")
public class Order {@TableIdprivate Long id;@TableFieldprivate Long userId;@TableFieldprivate Long productId;@TableFieldprivate Integer num;@TableFieldprivate Long price;@TableFieldprivate Integer deleteFlag;@TableField@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private LocalDateTime createTime;@TableField@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private LocalDateTime updateTime;@TableField(exist = false)private Product product;}// RestTemplate控制类
@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}}// mapper层
public interface OrderMapper extends BaseMapper<Order> {
}// service接口
public interface OrderService extends IService<Order> {Order getOrderById(Integer id);}// service实现类
@Slf4j
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {@Resourceprivate RestTemplate restTemplate;private final String PRODUCT_SERVICE_NAME = "cloud-provider-product-consul-8101";@Overridepublic Order getOrderById(Integer id) {// 获取订单Order order = this.getById(id);// 拼接urlString url = "http://" + this.PRODUCT_SERVICE_NAME + "/product/query/" + order.getProductId();log.info(url);// 远程调用Product product = this.restTemplate.getForObject(url, Product.class);order.setProduct(product);// 返回结果return order;}}// controller实现类
@RestController
@RequestMapping("/order")
public class OrderController {@Resourceprivate OrderService orderService;@GetMapping("/query/{id}")public Order getOrderById(@PathVariable Integer id) {return this.orderService.getOrderById(id);}}

启动项目之后,出现如下界面,就表示启动成功了:

bug

当两个服务都启动之后,就调用127.0.0.1:81/order/query/1来进行调用,查看远程调用是否成功。本来计划着没啥问题,但是,出错了,如下图:

原因是因为Consul自动实现了负载均衡,但是并没有引入负载均衡的依赖,于是我就去查看了一下pom依赖。原来是Consuljar包中带了负载均衡的依赖啊,如下图:

那这就说的通了,直接给RestTempalte加上@LoadBlanced注解。

@Configuration
public class RestTemplateConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}

加上注解之后,再次测试,完全没毛病了。

总结 

Consul组件跟Eurekal相比,不用再搭建一个Consul服务了。只要简单的三步:

引入依赖、添加配置、启动类添加注解。如果是使用RestTemplate等远程调用的话,再加一个负载均衡的注解即可。非常好用。

Consul对于CAP理论来说,保证的是强一致性。

分布式配置管理

在最上面的概述中,已经将分布式配置管理给简单介绍了一下。总的来说,分布式配置管理就是把一些配置文件放到Consul服务器上,这样可以做到无感刷新配置文件,从而减少开发、运维人员的工作。

bootstrap.yml

application.yml是用户级的资源配置项,bootstrap.yml是系统级的资源配置项,优先级更高。

SpringCloud会创建一个BootStrap Context,作为Spring应用Application Context的父上下文。初始化的时候,BootStrap Context负责从外部源加载配置属性并解析配置,这两个上下文共享一个从外部获取的Environment。

BootStrap属性有高优先级,默认情况下,他们不会被本地配置覆盖。BootStrap Context和Application Context有着不同的约定,所以新增了一个bootstrap.yml文件,保证两个上下文配置的分离。

修改商品服务

添加依赖

        <!--Consul配置中心--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-config</artifactId></dependency><!--BootStrap--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency>

修改配置文件

首先在Consul的Key/Value界面新建文件夹,用来存储配置文件:

在创建的config文件夹下,再创建三个文件:

 在每个文件夹下,再创建一个data文件:

在每一个data文件中,再分别加入内容,并且保证格式为yml格式。

注意,创建文件夹时要在名称后面带/,创建文件时则不需要。 

其次在商品服务下创建一个bootstrap.yml的文件,然后将原先appliaction.yml的文件全部迁移至bootstrap.yml文件中。

server:port: 8101spring:application:name: cloud-provider-product-consul-8101mvc:pathmatch:matching-strategy: ant_path_matcher # 路径匹配策略datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_product?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=trueusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverprofiles:active: devcloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}config:profile-separator: '-' # default value is ",",we update '-'format: YAMLmybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:mapper/**Mapper.xmltype-aliases-package: com.wbz.domain

在配置文件中,新增了如下配置:

spring:cloud:consul:config:profile-separator: '-' # default value is ",",we update '-'format: YAML

修改业务类

在业务类中添加如下代码,用来测试远程调用是否成功。

@RestController
@RequestMapping("/product")
public class ProductController {@Value("${test}")private String test;@Value("${info}")private String info;@GetMapping("/config")public String getConfig() {return test + " " + info;}}

启动项目之后,输入127.0.0.1:8101/product/config,出现如下界面,表示分布式配置管理成功:

 出现上述内容的原因是因为在配置文件中配置的环境为dev环境,如果把环境改为prod环境,那么就会出现如下内容:

总结

为什么配置文件是要写成上述格式?

如下图,为官网的配置格式。大概内容是想要把配置文件放到Consul上,首先要建立一个config文件夹,官方才认为这是配置文件中的内容;其次,对应的服务就要再创建文件夹进行配置,这样官方才认为该文件夹中的文件是某服务的文件。例如在咋们自己配置的文件中,首先创建了一个config文件,然后在下面创建了以cloud-provider-product-consul-8101为开头的三种文件夹。

在三种文件夹中,没有环境配置的表示每个环境都能读取其中的内容,也就是公共配置;后面有dev、prod的则表示是对应环境的配置,当然可以有其他的,这里只是做演示。

官网使用的是逗号来分割服务名和生产环境的,但是我们使用的是-,这是可以在配置文件中进行配置的。当然了,最后的文件夹的data名字也是可以进行配置的,官方默认是data。

修改真正配置

商品服务

首先将原来测试的配置文件、业务类等全部删除,然后只保留dev环境的文件夹,其他文件夹也删除,暂时用不上。

Consul上的配置文件

server:port: 8101spring:mvc:pathmatch:matching-strategy: ant_path_matcher # 路径匹配策略datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_product?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=trueusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:mapper/**Mapper.xmltype-aliases-package: com.wbz.domain

 bootstrap.yml中的配置文件

spring:application:name: cloud-provider-product-consul-8101cloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}config:profile-separator: '-' # default value is ",",we update '-'format: YAMLprofiles:active: dev

 修改完成之后,可以进行一个简单测试,输入127.0.0.1:8101/product/query/1001,只要出现结果就证明部署成功了。如果在部署过程中出错,可能是业务类没有删除,或者生产环境出错导致的。

订单服务

Consul上的配置文件

server:port: 81spring:mvc:pathmatch:matching-strategy: ant_path_matcher # 路径匹配策略datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_order?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&allowMultiQueries=trueusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:mapper/**Mapper.xmltype-aliases-package: com.wbz.domain

bootstrap中的配置文件

spring:application:name: cloud-consumer-order-consul-81cloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}config:profile-separator: '-'format: yamlprofiles:active: dev

切记,在修改的时候要记住先加上依赖,再修改配置文件。

动态刷新

启动项目之后,我们在Consul上的配置文件中进行修改,发现并没有起作用,原因是因为默认的刷新时间为55秒,因此我们修改之后是不会立刻起作用的,我们就需要等待一段时间。

在实际生产中,这个时间太长了,因此我们可以在主启动类上加上@RefreshScope注解,该注解的意思就是动态刷新。

持久化配置

当我们关闭小黑框之后,发现所有的配置都消失了,这是一个致命的错误,因此我们需要把配置持久化。

1. 新建一个mydata文件夹

 2. 创建一个consul_start.bat的文件

3. 进入文件,将下述内容添加到文件中,注意下述内容中的文件地址要和自己的一样。

@echo.服务启动......  
@echo off  
@sc create Consul binpath= "E:\java\spring\springcloud\consul_1.19.1\consul.exe agent -server -ui -bind=127.0.0.1 -client=0.0.0.0 -bootstrap-expect  1  -data-dir E:\java\spring\springcloud\consul_1.19.1\mydata   "
@net start Consul
@sc config Consul start= AUTO  
@echo.Consul start is OK......success
@pause

4. 点击文件,右键管理员方式运行。

5. 运行成功之后,查看任务管理器,发现consul.exe已经变成了后台进程,那么表示此时就持久化成功了。 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

台球助教预约小程序源码开发:技术解析与示例代码

随着数字化时代的到来&#xff0c;信息技术与体育运动的融合日益紧密。台球作为一项深受大众喜爱的运动&#xff0c;其教学训练领域也迎来了技术创新的浪潮。本文将探讨台球助教预约小程序的开发过程&#xff0c;从技术选型、功能设计到示例代码展示renxb001&#xff0c;全面解…

yub‘s Algorithmic Adventures_Day7

环形链表 link&#xff1a;https://leetcode.cn/problems/linked-list-cycle-ii/description/ 思路分析 我只能说双指针yyds【刻板hh】 我们分两种情况来分析 起码在第二圈才会相遇 fast比slow多走环的整数倍 fast 走的步数是 slow 步数的 2 倍&#xff0c;即 f2s&#xff…

计算机网络:计算机网络体系结构 —— 专用术语总结

文章目录 专用术语实体协议服务服务访问点 SAP 服务原语 SP 协议数据单元 PDU服务数据单元 SDU 专用术语 实体 实体是指任何可以发送或接收信息的硬件或软件进程 对等实体是指通信双方处于相同层次中的实体&#xff0c;如通信双方应用层的浏览器进程和 Web 服务器进程。 协…

Kubernetes中部署ELK Stack日志收集平台

1 、ELK概念 ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。市面上也被成为Elastic Stack。其中: Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elas…

单目3d重建DUSt3R 笔记

目录 DUSt3R 三维重建 报错RecursionError: maximum recursion depth exceeded in comparison 报错 numpy.core.multiarray failed to import 报错Numpy is not available 解决 升级版mast3r 速度变慢 修改了参数设置脚本&#xff1a; 测试效果 操作技巧 DUSt3R 三维重…

重学SpringBoot3-集成Redis(九)之共享Session

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;九&#xff09;之共享Session 1. 为什么需要 Session 共享2. Spring Session 和 Redis 的集成2.1. 引入依赖2.2. 配置 Redis 连接…

基于单片机的智能浇花系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采样DHT11温湿度传感器检测温湿度&#xff0c;通过LCD1602显示 4*4按键矩阵可以设置温度湿度阈值&#xff0c;温度大于阈值则开启水泵&#xff0c;湿度大于阈值则开启风扇…

INS淡绿色风格人像街拍Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍 INS 淡绿色风格人像街拍通过 Lightroom 调色可以营造出清新、自然、时尚的视觉效果。这种风格以淡绿色为主色调&#xff0c;给人一种宁静、舒适的感觉。 预设信息 调色风格&#xff1a;INS风格预设适合类型&#xff1a;人像&#xff0c;街拍&#xff0c;自拍&#…

第三方软件测评机构简析:软件安全测试报告的内容和作用

随着数字化时代的到来&#xff0c;软件的安全性显得尤为重要。尤其在信息安全事件频发的今天&#xff0c;软件安全测试报告成为企业和开发者关注的焦点。软件安全测试报告是评估软件系统安全性的一种综合性文档&#xff0c;通常在软件开发生命周期中进行安全性测试后生成。 软…

UE4 材质学习笔记03(翻书(Flipbook)动画/环境混合)

一.FlipBook Animation 如果你想让游戏以每秒30帧的速度运行&#xff0c;所有内容都必须在33毫秒内渲染出来&#xff0c; 如果你想让游戏以每秒60帧的速度运行的话&#xff0c;必须在16毫秒内。 所以当一个效果需要很多细节的时候&#xff0c;往往会离线创建它&#xff0c;然…

关于PPT生成的开源大模型总结

目前需要开源的PPT生成模型&#xff0c;在这里对github上的一些模型进行筛选 搜索关键词&#xff1a;ppt generate&#xff08;more starts&#xff09; williamfzc/chat-gpt-ppt: 支持直接生成PPT支持中英文需要调用ChatGPT&#xff08;Add your token (official openai api k…

Perforce演讲回顾(上):从UE项目Project Titan,看Helix Core在大型游戏开发中的版本控制与集成使用策略

日前&#xff0c;Perforce携手合作伙伴龙智一同亮相Unreal Fest 2024上海站&#xff0c;分享Helix Core版本控制系统及其协作套件的强大功能与最新动态&#xff0c;助力游戏创意产业加速前行。 Perforce解决方案工程师Kory Luo在活动主会场&#xff0c;带来《Perforce Helix C…

dfs 判重Sequence one——hdu 2610

目录 前言 搜索算法判重 map判重 set判重 Sequence one 问题描述 输入 输出 数据范围 样例 问题分析 重构dfs参数 递减&#xff0c;不重复 去重的优化 最终代码 前言 搜索算法判重 搜索算法判重有很多种方法&#xff0c;常见的有两种&#xff0c;map判重和set判重…

linux安装mysql显示公钥尚未安装 :mysql-community-libs-8.0.39-1.el7.x86_64.rpm 的公钥尚未安装

linux安装mysql显示公钥尚未安装 mysql-community-libs-8.0.39-1.el7.x86_64.rpm 的公钥尚未安装 如题&#xff0c;当执行 yum install -y mysql-community-server 报错 解决办法 命令行执行 yum install -y mysql-community-server --nogpgcheck 也就是在原来的命令后面…

Pikachu-url重定向-不安全的url跳转

不安全的url跳转 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能发生"跳错对象"的问题。 url跳转比较直接的危害是: …

120页满分PPT | 企业级业务架构和IT架构规划方案

方案内容综述 方案涵盖了从战略分析到具体实施路径的内容。提出了IT架构规划的工作思路&#xff0c;包括项目启动、部门访谈、资料收集、内部数据库搜索与先进实践研究等步骤&#xff0c;旨在通过这些步骤完成现状及差距分析&#xff0c;并基于此设计未来的应用架构、数据架构…

【java】final关键字详解

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…

路由:ReactRouter

概述 一个路径path对应一个组件component 当我们在浏览器中访问一个path的时候&#xff0c;path对应的组件会在页面中进行渲染。 使用 快速开始 安装依赖 npm i react-router-dom基本使用 import { createBrowserRouter, RouterProvider } from react-router-domconst ro…

《Linux从小白到高手》理论篇:一文概览常用Linux重要配置文件

List item 今天继续宅家&#xff0c;闲来无事接着写。本篇是《Linux从小白到高手》理论篇的最后一篇了。本篇集中介绍所有常用的Linux重要配置文件。 用这个命令可以查看配置文件所在的位置&#xff1a;如上图 locate "*.conf" "*.ini" "*.cfg&quo…

Meilisearch 和 Ollama 实现文本向量搜索

Meilisearch 是一个开源、快速、简洁的全文搜索引擎&#xff0c;专为构建高性能、实时的搜索功能而设计。其主要特点如下&#xff1a; 极速搜索&#xff1a;Meilisearch 使用反向索引来加速搜索查询&#xff0c;因此能够在海量数据中提供毫秒级的响应时间&#xff0c;尤其适合实…