【Nacos】使用Nacos进行服务发现、配置管理

Nacos

Nacos是 Dynamic Naming and Configuration Service 的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

版本说明:版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub

<properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version><spring-cloud.version>2021.0.5</spring-cloud.version><spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
</properties>

Quick Start

Windows安装Nacos(Linux同理)

去GitHub下载压缩包,将conf文件夹里的nacos-mysql.sql表存储到数据库中

取消application.properties这三行的注释,修改user和password

启动:双击startup.cmd会报错,在cmd中输入startup.cmd -m standalone。这是因为默认以集群方式启动,而集群启动需要配置,不配置会报错,所以以单例启动就可以

启动后访问:http://localhost:8848/nacos/index.html#

遇到的坑

  1. 初始化完成后登录显示用户名或密码错误,这是系统bug,重启服务
  2. 2.x版本连接报错Client not connected, current status:STARTING,防火墙开启8848、8948、8949
  3. 2.x版本集群8848、8849、8850时,8849启动失败。设置为8848、8850、8852即可

Nacos注册中心

服务注册与发现

概念

微服务与传统单体式应用架构最大区别就是强调软件模块的拆分。在单体架构下,一个应用系统的多个功能模块由于组织在一起在同一个应用进程内部署与运行,因此,模块之间直接通过方法调用即可完成对一次请求的响应。但在微服务系统中,需要对一个应用系统根据其功能特点,按照一定粒度进行拆分后单独部署,以便实现模块内的高内聚,模块间的低耦合,实现整个微服务系统的高可扩展性:

原来一次在一个应用内即可完成的请求处理,会出现跨进程跨主机的服务调用,如何让这个服务之间能互相发现像单体式应用一样提供统一对外的服务调用能力是微服务框架层面需要重点解决的核心问题之一。 在 Spring Cloud 生态中,采用了如下服务注册与发现模型,来实现微服务之间的互相发现与调用。

通过在微服务系统中引入一个叫做注册中心的组件,来作为协调者。其最简化的过程是,所有的微服务应用在启动过程中会将自身包含服务名称、主机IP地址和端口号等信息发送到注册中心中,然后上游的微服务在处理请求过程中,根据服务名称到注册中心中查找对应服务的所有实例IP地址和端口号来进行服务调用,整个过程如图中虚线所示。从而让分散的微服务系统之间能像一个整体一样对外提供请求处理能力。

项目demo1

创建一个springboot项目,加入相关依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

编写applicant.yml配置文件

# 端口
server:port: 8081# 应用名称
spring:application:name: nacos-client-02# nacos配置cloud:nacos:username: nacospassword: edishena# 向哪里注册server-addr: 43.139.248.149:8848discovery:# 注册的服务名service: nacos-service# 注册到哪个命名空间namespace: 79151db2-6086-49be-b3ac-17eaa5946e2c# 注册到哪个组group: A_GROUP

开启服务发现

package priv.happy.nacosclient01;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
// 开启服务发现
@EnableDiscoveryClient 
public class NacosClient01Application {public static void main(String[] args) {SpringApplication.run(NacosClient01Application.class, args);}
}

启动项目后即可在nacos控制台看到当前的服务

跨命名空间调用

不能跨命名空间、跨组调用

集成OpenFeign

注意事项

添加依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

注意,SpringCloud Feign在Hoxton.M2 RELEASE版本之后不再使用ribbon,而是使用spring-cloud-loadbalancer,所以在不引入spring-cloud-loadbalancer情况下会报错

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'testController': Unsatisfied dependency expressed through field 'feign'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'priv.happy.nacosclient01.feign.FoodFeign': Unexpected exception during bean creation; nested exception is java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?……at priv.happy.nacosclient01.NacosClient01Application.main(NacosClient01Application.java:14) [classes/:na]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'priv.happy.nacosclient01.feign.FoodFeign': Unexpected exception during bean creation; nested exception is java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?... 20 common frames omitted
Caused by: java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?... 28 common frames omitted

解决方法

  • 第一中,通过修改依赖解决
    1. 排除nacos中的ribbon依赖
    2. 添加loadbalancer依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><exclusions><exclusion><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></exclusion></exclusions>
</dependency><!--客户端负载均衡loadbalancer-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
  • 第二种,通过修改配置解决
spring.cloud.loadbalancer.ribbon.enabled=false
spring.cloud.loadbalancer.nacos.enabled=true

注意:需要在同一个namespace的同一个group下才能调用成功,否则报错503

2023-08-21 11:01:45.278 ERROR 9388 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is feign.FeignException$ServiceUnavailable: [503] during [GET] to [http://nacos-service/food] [FoodFeign#getFood()]: [Load balancer does not contain an instance for the service nacos-service]] with root causefeign.FeignException$ServiceUnavailable: [503] during [GET] to [http://nacos-service/food] [FoodFeign#getFood()]: [Load balancer does not contain an instance for the service nacos-service]at feign.FeignException.serverErrorStatus(FeignException.java:256) ~[feign-core-11.10.jar:na]at feign.FeignException.errorStatus(FeignException.java:197) ~[feign-core-11.10.jar:na]at feign.FeignException.errorStatus(FeignException.java:185) ~[feign-core-11.10.jar:na]at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:92) ~[feign-core-11.10.jar:na]at feign.AsyncResponseHandler.handleResponse(AsyncResponseHandler.java:98) ~[feign-core-11.10.jar:na]at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:141) ~[feign-core-11.10.jar:na]at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:91) ~[feign-core-11.10.jar:na]at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:100) ~[feign-core-11.10.jar:na]at com.sun.proxy.$Proxy69.getFood(Unknown Source) ~[na:na]at priv.happy.nacosclient01.controller.TestController.test(TestController.java:33) ~[classes/:na]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_221]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_221]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_221]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_221]

项目demo2

服务提供者

新建一个上述的springboot项目,作为服务服务提供者,编写一个controller对外提供服务(这个服务的名称是nacos-service)

package priv.happy.nacosclient02.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ProviderController {@GetMapping("food")public String getFood() {return "大米饭一碗";}
}

服务消费者(由消费者发起远程调用)

新建一个demo1中的springboot项目,作为消费者,添加openfeign依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

开启远程调用

package priv.happy.nacosclient01;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
@EnableDiscoveryClient
// 开启远程调用
@EnableFeignClients
public class NacosClient01Application {public static void main(String[] args) {SpringApplication.run(NacosClient01Application.class, args);}}

编写Feignclient,发起远程调用

package priv.happy.nacosclient01.feign;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;// value是要调用的那个服务的名称
@FeignClient(value = "nacos-service")
public interface FoodFeign {@GetMapping("food")String getFood() ;
}

编写消费者的controller,对用户提供访问功能

package priv.happy.nacosclient01.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import priv.happy.nacosclient01.feign.FoodFeign;import java.util.List;/*** @Author: HAPPY* @Project_name: nacos-practice* @Package_name: priv.happy.nacosclient01.controller* @Date: 2023/8/21 10:22* @Description:*/
@RestController
public class TestController {@AutowiredDiscoveryClient discoveryClient;@AutowiredFoodFeign feign;@GetMapping("test")public String test(){List<ServiceInstance> instances = discoveryClient.getInstances("nacos-service");System.out.println(instances);return feign.getFood();}
}

集成GateWay

加入gateway依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

端口:80

server:port: 80spring:application:name: gatewaycloud:nacos:server-addr: 43.139.248.149:8848username: nacospassword: edishena.discovery:group: A_GROUPnamespace: 79151db2-6086-49be-b3ac-17eaa5946e2cgateway:discovery:locator:# 开启动态路由enabled: truelower-case-service-id: true

nacos集群

  • 8848
    • 9848
    • 9849
  • 8850
    • 9850
    • 9851
  • 8852
    • 9852
    • 9853

Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。

端口

与主端口的偏移量

描述

9848

1000

客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求

9849

1001

服务端gRPC请求服务端端口,用于服务间同步等

7848

-1000

Jraft请求服务端端口,用于处理服务端间的Raft相关请求

使用VIP/nginx请求时,需要配置成TCP转发,不能配置http2转发,否则连接会被nginx断开。 9849和7848端口为服务端之间的通信端口,请勿暴露到外部网络环境和客户端测。

配置文件

server:port: 8080spring:application:name: nacos-client-01cloud:nacos:
#      server-addr: 43.139.248.149:8848# 配置集群server-addr: localhost:8848, localhost:8850, localhost:8852
#      username: nacos
#      password: edishena.discovery:namespace: c7ffbcd1-c4d8-425b-b41c-a1077693fa57group: A_GROUP

Nacos配置管理

在单体架构的时候将配置写在配置文件中,缺点就是每次修改配置都需要重启服务才能生效。当应用程序实例比较少的时候还可以维护。如果转向微服务架构有成百上千个实例,每修改⼀次配置要将全部实例重启,不仅增加了系统的不稳定性,也提高了维护的成本。做到服务不重启就可以修改配置,产生了四个基础诉求:

  • 需要支持动态修改配置
  • 需要动态变更有多实时
  • 变更快了之后如何管控控制变更风险,如灰度、回滚等
  • 敏感配置如何做安全配置

采用分布式配置中心的软件架构如图所示,其可以在分布式场景中帮助解决以下问题:

  1. 管理应用程序配置:当有大量应用程序需要管理时,手动维护配置文件会变得非常困难。分布式配置中心提供了一个集中管理和分发配置信息的解决方案。
  2. 环境隔离:在开发、测试和生产等不同环境中,应用程序的配置信息往往都会有不用。使用分布式配置中心,可以轻松地管理和分发不同环境下的配置信息。
  3. 提高程序安全性:将配置信息存储在代码库或应用程序文件中可能会导致安全风险,因为这些信息可能会被意外地泄漏或被恶意攻击者利用。使用分布式配置,可以将配置信息加密和保护,并且可以进行访问权限控制。
  4. 动态更新配置:在应用程序运行时,可能需要动态地更新配置信息,以便应用程序可以及时响应变化。使用分布式配置中心,可以在运行时动态更新配置信息,而无需重新启动应用程序。

依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- springcloud 2020禁用了bootstrap,需要手动导入 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

配置文件名称为:prefix-active.file-extension,需要在nacos控制台输入后缀

server:port: 8082
spring:application:name: nacos-config-01cloud:nacos:username: nacospassword: 123456server-addr: localhost:8848# 项目启动时在哪里找配置文件config:# 读哪个配置文件prefix: nacos-config-01# 配置文件格式file-extension: ymlnamespace: c7ffbcd1-c4d8-425b-b41c-a1077693fa57# 配置文件名称为  prefix-active.file-extension      profiles:active: dev

读取多个配置文件

server:port: 8082
spring:application:name: nacos-config-01cloud:nacos:username: nacospassword: 123456server-addr: localhost:8848# 项目启动时在哪里找配置文件config:# 配置文件格式file-extension: ymlnamespace: c7ffbcd1-c4d8-425b-b41c-a1077693fa57# 读取多个配置文件extension-configs:- data-id: nacos-config-01-dev.ymlgroup: DEFAULT_GROUPrefresh: true- data-id: nacos-config-02-dev.ymlgroup: A_GROUPrefresh: true

项目启动报错

[main] DEBUG org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter - Application failed to start due to an exception
org.springframework.cloud.commons.ConfigDataMissingEnvironmentPostProcessor$ImportException: No spring.config.import set***************************
APPLICATION FAILED TO START
***************************Description:No spring.config.import property has been definedAction:Add a spring.config.import=nacos: property to your configuration.
If configuration is not required add spring.config.import=optional:nacos: instead.
To disable this check, set spring.cloud.nacos.config.import-check.enabled=false.

加入bootstrap依赖

<!-- springcloud 2020 以后禁用了bootstrap,需要手动导入 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

问题

username和password不写也可以

使用Nacos时,如果不配置Nacos的用户名和密码,可以将username和password属性留空或不配置。Nacos客户端将以匿名方式连接到Nacos服务器。

standalone和cluster模式下点击下线没反应

Nacos已经下线了该功能,只是前端UI未进行修改

cluster配置集群的ip,每次电脑的ip都不一样,需要每次开机都修改cluster.conf中的ip地址

改成localhost:port即可

只启动了三个集群多了一个

这是因为在nacos的配置文件中没有指定nacos的ip,因此默认使用192.168.0.1这种,但集群的配置文件里的ip又是127.0.0.1这种,因此会显示两个。在application.properties文件中修改即可。

nacos控制台中,每个服务都有一个订阅者,且应用名是unknown

应用名unknown是因为需要进行配置,有两种方式(我只是了第一种),在运行配置中添加虚拟机选项 -Dproject.name=application

服务提供者的订阅者中,刚开始是没有消费者的,只有当消费者发送过请求,访问过服务提供者以后,服务提供者的订阅者中才会有消费者

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

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

相关文章

unity3d:功能验证,收集开源项目的工程合集

unity3d功能验证&#xff0c;和收集开源项目的工程合集 目录持续更新地址 【腾讯文档】UnityForTest目录 https://docs.qq.com/doc/DWm9HSkVhTGdyUUVo 源码 https://github.com/luoyikun/UnityForTest 动画 创建骨骼动画 BoneAnimation场景 代码创建Mesh&#xff0c;骨骼…

Flask项目请求图片资源返回403错误

问题 解决 在图片url前缀前加 "https://images.weserv.nl/?url" 参考 如何解决访问外部图片返回 403 Forbidden 错误 - 知乎 vue中请求接口会自动带上本地ip_vite打包后请求地址为什么带本地地址_夜月晓晓的博客-CSDN博客

CSS判断手机暗黑模式

手机有个功能到了晚上会自动变成深色也就是暗黑模式.这种情况下网页会自动变颜色.如果想自由控制暗黑模式下的html样式的话,可以用如下方式: media (prefers-color-scheme: dark) {/*html, body {*//*filter: invert(1) hue-rotate(180deg);*//*}*/.maill{margin-left: 0;marg…

【ES系列】(一)简介与安装

首发博客地址 首发博客地址[1] 系列文章地址[2] 教学视频[3] 为什么要学习 ES? 强大的全文搜索和检索功能&#xff1a;Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;使用倒排索引和分布式计算等技术&#xff0c;提供了强大的全文搜索和检索功能。学习 ES 可以掌…

【FreeRTOS】互斥量的使用与逐步实现

在FreeRTOS中&#xff0c;互斥量是一种用于保护共享资源的同步机制。它通过二进制信号量的方式&#xff0c;确保在任意时刻只有一个任务可以获取互斥量并访问共享资源&#xff0c;其他任务将被阻塞。使用互斥量的基本步骤包括创建互斥量、获取互斥量、访问共享资源和释放互斥量…

【Vue3 知识第二讲】Vue3新特性、vue-devtools 调试工具、脚手架搭建

文章目录 一、Vue3 新特性1.1 重写双向数据绑定1.1.1 Vue2 基于Object.defineProperty() 实现1.1.2 Vue3 基于Proxy 实现 1.2 优化 虚拟DOM1.3 Fragments1.4 Tree shaking1.5 Composition API 二、 vue-devtools 调试工具三、环境配置四、脚手架目录介绍五、SFC 语法规范解析附…

Android Studio 的github 工程克隆

上文介绍了Android Studio 里的"Git 建立和简单操作。本文介绍从github 上的工程fork 和clone到本地&#xff0c;然后学习和改进。 本文参考 https://learntodroid.com/how-to-use-git-and-github-in-android-studio/ 克隆clone Github 仓库&#xff1a; 先 Fork 你选择…

实战黑马苍穹外卖项目8.1-10.1

文章目录 软件开发的基本流程用户层网关层应用层数据层工具 数据库设计导入准备好的前端和后端工程基础工程代码分析完成员工功能完成菜品功能入门Redis实现店铺营业HttpClient微信小程序开发缓存Spring Cache实现地址功能用户下单实现订单推送状态apache对应的工具使用项目用到…

无涯教程-Flutter - 数据库

SQLite" class"css-1occaib">SQLite数据库是基于事实和标准SQL的嵌入式数据库引擎&#xff0c;它是小型且经过时间考验的数据库引擎&#xff0c;sqflite软件包提供了许多函数&#xff0c;可以有效地与SQLite数据库一起使用&#xff0c;它提供了操作SQLite数据…

ExpressLRS开源代码之框架结构

ExpressLRS开源代码之框架结构 1. 源由2. Arduino应用框架3. ExpressLRS应用框架4. 硬件设计框架4.1 单天线4.2 双天线单PA4.3 双天线双PA 5. 应用软件设计6. 参考资料 1. 源由 最近为了理解《ExpressLRS开源之基本调试数据含义》&#xff0c;做了一些源代码的研读。 概念、文…

基于costas环的载波同步系统matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................................ I_Dataroun…

kubernetes进阶 (一) 环境搭建

我是基于一台centos7.6的腾讯云主机进行操作的&#xff0c;配置为4C8G&#xff0c;之前的文档自己试着搭建发现有问题了&#xff0c;这里重新整理下笔记&#xff0c;集群版本选择1.22.2&#xff08;一年前搭的&#xff09;用的还不错 清理环境 之前我的环境可能装过docker或者什…

Ansible学习笔记4

file模块&#xff1a; file模块用于对文件相关的操作&#xff08;创建、删除、属性修改、软链接等&#xff09;touch是创建。 [rootlocalhost ~]# ansible group1 -m file -a "path/tmp/111 statetouch" 192.168.17.105 | CHANGED > {"ansible_facts"…

[SpringBoot3]视图技术Thymeleaf

七、视图技术Thymeleaf Thymeleaf是一个表现层的模板引擎&#xff0c;一般被使用在Web环境中&#xff0c;它可以处理HTML、XML、JS等文档&#xff0c;简单来说&#xff0c;它可以将JSP作为Java Web应用的表现层&#xff0c;有能力展示与处理数据。这样&#xff0c;同一个模板文…

1. 安装Zookeeper

​ 1.下载 点击下载Zookeeper 单机版安装 安装Zookeeper前需要先安装jdk上传安装包rz解压安装包:tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz -C /opt/app/zookeeper zookeeper目录结构:a. bin: 放置运行脚本和工具脚本b. conf: zookeeper 默认读取配置的目录,里面会有…

docker安装gitlab

安装gitlab sudo docker run --detach \--hostname gitlab \--publish 543:443 --publish 90:80 --publish 222:22 \ --name gitlab \--restart always \--volume $GITLAB_HOME/config:/etc/gitlab \--volume $GITLAB_HOME/logs:/var/log/gitlab \--volume $GITLAB_HOME/data:…

Android 蓝牙开发( 四 )

前言 上一篇文章给大家分享了Kotlin版的Android蓝牙的基础知识和基础用法&#xff0c;不过上一篇都是一些零散碎片化的程序&#xff0c;&#xff0c;这一篇给大家分享Android蓝牙开发实战项目KotlinCompose的初步使用 效果演示 : Android Compose 蓝牙开发 Android蓝牙实战开发…

基于Laravel通用型内容建站企业官网系统源码 可免费商用

是一个基于 Laravel 企业内容建站系统。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;免费且不限制商业使用 2023年08月23日增加了以下12个特性&#xff1a; [新功能] 手机端Banner支持…

qt creater11 翻译国际化教程教程:

先出效果图。 闲聊几句&#xff1a;qt这个翻译很方便&#xff0c;能直接导出项目里所有文字。 具体步骤如下&#xff1a; 在Qt中&#xff0c;我们可以使用QTranslator类来实现多语言切换。以下是一般步骤&#xff1a; 1. 在你的源代码中&#xff0c;所有需要翻译的字符串都…

Git企业开发控制理论和实操-从入门到深入(四)|Git的远程操作|Gitee

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…