首页
友链
关于
免责声明
Search
1
王者营地战绩数据王者荣耀查询网页源码
6,209 阅读
2
群晖Active Backup for Business套件备份Linux服务器教程
4,384 阅读
3
影视分享
4,313 阅读
4
(亲测)Jrebel激活破解方式2019-08-21
4,289 阅读
5
centos7 安装及卸载 jekenis
3,573 阅读
日常
文章
后端
前端
Linux
异常
Flutter
分享
群辉
登录
Search
标签搜索
docker
springboot
Spring Boot
java
linux
Shiro
Graphics2D
图片
游戏账号交易
Mybatis
Spring Cloud
centos
脚本
Web Station
群辉
王者营地
战绩查询
平台对接
Spring Cloud Alibaba
nacos
绿林寻猫
累计撰写
249
篇文章
累计收到
26
条评论
首页
栏目
日常
文章
后端
前端
Linux
异常
Flutter
分享
群辉
页面
友链
关于
免责声明
搜索到
237
篇与
文章
的结果
2023-07-26
Spring Cloud Alibaba 系列之 Nacos 篇(配置中心)
一、前言上一篇 Spring Cloud Alibaba 系列之 Nacos 篇(服务注册与发现) 介绍了 Nacos 的服务注册与发现,本篇接续介绍其另一个功能--配置中心。二、简单介绍Nacos 提供用于存储配置和其他元数据功能,为分布式系统中的外部化配置提供服务器端和客户端支持,使用 Spring Cloud Alibaba Nacos Config 就可以在 Nacos Server 集中管理 Spring Cloud 应用的外部属性配置。2.1 实现目的不使用配置中心之前,我们在管理项目配置会遇到如下问题:{message type="info" content="配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。配置文件无法区分环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。"/}这些问题通过使用 Nacos 的配置中心功能快捷、简便的解决。2.2 基础概念为了区分环境或项目间的配置,我们需要了解 Nacos 给出的如下3个概念:{message type="warning" content=" 命名空间(Namespace)命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间"/}{message type="warning" content=" 配置分组(Group)命配置分组用于将不同的服务可以归类到同一分组。一般将一个项目的配置分到一组"/}{message type="warning" content=" 配置集(Data ID)在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集"/}三者关系如下图: 三、实战演练首要条件就是启动 Nacos 的服务环境。我们使用上一篇文章搭建好的 Nacos 服务,不清楚的读者可以先移步至上一篇浏览前置内容。3.1 基础配置搭建名为 nacos-config 的springboot项目 🔧 第一步,添加依赖:<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.demo</groupId> <artifactId>nacos</artifactId> <version>1.0.0</version> </parent> <packaging>jar</packaging> <artifactId>nacos-config</artifactId> <description> 配置中心 </description> <properties> <java.version>1.8</java.version> <!--编译项目不生成测试类也不进行测试--> <maven.test.skip>true</maven.test.skip> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> <dependencyManagement> <dependencies> <!-- spring cloud 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR3</version> <type>pom</type> <scope>import</scope> </dependency> <!-- spring cloud alibaba 依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.1.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 🔧 第二步,创建 bootstrap.properties 或 bootstrap.yml 文件: 使用配置中心后,我们通常会把 application.properties 或 application.yaml 中的配置移植到 Nacos 服务上,但项目连接配置中心服务需要单独配置,因此需要用到 bootstrap.properties 或 bootstrap.yml 文件。其中,这 4 种文件的加载顺序由高到低依次是:{message type="info" content=" 📢 bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml"/}我们的 bootstrap.yml 配置如下:server: port: 38001 spring: application: # 应用名 name: nacos-config cloud: nacos: config: server-addr: 127.0.0.1:8848 # namespace: public group: DEFAULT_GROUP file-extension: yaml # 配置格式(默认是 properties) # 连接注册中心的账号和密码 以下是默认账密 username: nacos password: nacos 🔧 第三步,移植配置数据: 即将 application.properties 或 application.yml 中的业务配置数据移植到配置中心服务上。本次演练,我们使用如下配置数据进行测试:www: name: www.maven.vip 登录 Nacos 管理后台,管理配置 -> 配置列表,,操作如下图:在新建配置界面中, Data ID 通常对应 spring.application.name 的值 + (.properties 或 .yaml)。数据配置格式,目前只支持 properties 和 yaml。 🔧 第四步,创建测试类: 用于封装上文在 Nacos 服务上配置的数据@Data @Component @ConfigurationProperties(prefix = "www") public class DataBaseConfig { private String name; }用于测试获取配置数据@RestController @RefreshScope public class ConfigController { @Autowired private DataBaseConfig dataBaseConfig; // @Value注解可以获取到配置中心的值,但是无法动态感知修改后的值,需要利用@RefreshScope注解 @Value("${www.name}") private String name; @RequestMapping("/getConfig") public String getConfig() { return dataBaseConfig.getName(); } @RequestMapping("/getName") public String getName() { return name; } }接下来进行接口请求测试,启动项目,请求 🎈 http://127.0.0.1:38001/getConfig 结果如下图:成功请求获取配置中心的数据。3.2 动态刷新所谓动态刷新就是在不重启项目的基础上,修改配置中心的数据,项目能立即获取最新数据,接下来我们操作一遍:将配置数据改成:www: name: www.baidu.com修改配置后,不重启项目,再次请求接口,成功获取修改后的配置数据。3.3 环境隔离项目开发一般分为,开发、测试、预发和生产这4个阶段,每个阶段都有对应的配置数据(数据库、redis、MQ 连接配置等),这些数据都各不相同,为了更好的区分和维护这些数据,环境隔离功能必不可少。那配置中心如何做环境隔离呢?需要用到上文提到的命名空间,操作如下:📍 第一步,登录 Nacos 管理后台,命名空间菜单,新建一个名为 TEST 的命名空间:该命名空间就作为测试环境的专属空间。📍 第二步,在新建的命名空间下,创建一个配置:www: name: test📍 第三步,修改项目中的 bootstrap.properties 或 bootstrap.yml 文件,新增:server: port: 38001 spring: application: # 应用名 name: nacos-config cloud: nacos: config: server-addr: 127.0.0.1:8848 #此处就是创建 TEST 命名空间生成的 id 值 namespace: c716de35-9cb2-4c82-b86b-c74854ef726b group: DEFAULT_GROUP file-extension: yaml # 配置格式(默认是 properties) # 连接注册中心的账号和密码 以下是默认账密 username: nacos password: nacos最后,重启项目,请求接口,结果如下图:成功请求 TEST 命名空间下的配置数据。3.4 数据持久化Nacos 默认情况下是采用 apache derby 内嵌数据库进行数据存储,在单机模式时可以使用 Nacos 嵌入式数据库实现数据存储,但是 derby 数据库不方便观察数据存储的基本情况,从 Nacos 0.7 版本开始增加了支持 mysql 数据源能力。接下来,我们实现持久化功能。📍 第一步,创建名为 nacos_config 的数据库,在 Nacos 的程序包下,有个 conf 目录,将里边的 nacos-mysql.sql 导入到新建的数据库中。📍 第二步,修改 conf/application.properties 的数据库连接配置:将注释打开:spring.datasource.platform=mysql db.num=1 # 注意修改数据库名、账号和密码 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=root db.password.0=tiger📍 第三步,重启 Nacos 服务,再次访问 http://localhost:8848/nacos ,如下图:登录发现,之前配置的数据都消失,因为我们更换了存储源( MySQL )。现在数据库中的数据都是空的,在 Nacos 管理后台中,我们尝试新建一条配置:database.url=abc database.username=root database.password=riger保存后,查看数据库信息,如下图:配置数据成功持久化。3.5 集群部署为保证配置中心的高可用性,集群部署是必不可少的整合方案。我们在本地测试,将 Nacos 安装包拷贝成 3 份,在持久化模式的基础上,操作步骤如下:📍 第一步,将 Nacos 程序包下的 conf/cluster.conf.example 改名为 conf/cluster.conf ,修改内容:127.0.0.1:8801 127.0.0.1:8802 127.0.0.1:8803📍 第二步,修改 3 份 Nacos 安装包下的 conf/application.properties 文件,将 server.port 依次改成 8801,8802,8803 。保存后,启动 3 份 Nacos 即可:cd nacos/bin # windows 单机模式启动 startup.cmd # linux/mac ./startup.sh注意,启动命令无需加 -m standalone 参数引申问题: Nacos 做了集群,有 3 个访问地址,客户端如何配置请求呢?有 2 种请求方案:修改 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8801,127.0.0.1:8802,127.0.0.1:8803使用 Nginx 反向代理 Nacos 集群。四、参考资料📣 Nacos 官网五、项目源码📣 源码
2023年07月26日
2,258 阅读
2 评论
0 点赞
2023-07-26
Spring Cloud Alibaba 系列之 Nacos 篇(服务注册与发现)
一、前言Nacos 是阿里巴巴于2018年7月推出来的一个开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理。{alert type="info"} ::(灯泡) 其关键特性:服务发现和服务健康监测动态配置服务动态 DNS 服务服务及其元数据管理{/alert}Nacos 的功能包含 Spring Cloud 组件中的 Spring Cloud Eureka 和 Spring Cloud Config ,本篇章先介绍 Nacos 的服务注册与发现功能。二、环境搭建Nacos 作为服务注册发现中心,其运行原理与 Spring Cloud Eureka 大致相同,都由注册中心,服务提供者,服务消费者 3 部分组成和运作。如下图:与 Spring Cloud Eureka 不同的是, Nacos 服务无需开发者引入 Jar 依赖搭建,只需下载 官网 提供的安装包,解压启动即可。强调一下,安装 Nacos服务需要满足一下条件:64 bit OS64 bit JDK 1.8+Maven 3.2.x+ Nacos官方提供 2 种安装方式:① GitHub 上下载源码,编译安装启动,② 直接下载编译好的安装包。笔者选择第二种,点击 :@(抠鼻) Nacos releases 选择 1.4.6 版本的 .zip 文件下载。本地解压,如下图:💻 执行如下命令:cd nacos/bin # windows 单机模式启动 startup.cmd -m standalone # linux/mac ./startup.sh -m standalone启动成功后,打开浏览器输入 ::(OK) http://localhost:8848/nacos 可以访问Nacos后台管理界面,默认账户 nacos/nacos,如下图:至此 Nacos 服务注册中心环境搭建成功。三、实战演练注册中心服务搭建完成,现在开始搭建服务提供者和服务消费者。我们搭建如下 3 个项目:项目端口说明springCloudAlibabaDemo-pom 类型的父项目nacos-discovery-provider18001子项目,服务提供者nacos-discovery-consumer28001子项目,服务消费者3.1 搭建父工程创建名为 springCloudAlibabaDemo 的 Maven 项目,修改 pom.xml 文件:<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.demo</groupId> <artifactId>nacos</artifactId> <version>1.0.0</version> <name>maven</name> <url>https://www.maven.vip</url> <description>demo</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <modules> <module>nacos-discovery-provider</module> <module>nacos-discovery-consumer</module> </modules> <packaging>pom</packaging> <dependencyManagement> <dependencies> <!-- spring boot 依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!-- spring cloud 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR3</version> <type>pom</type> <scope>import</scope> </dependency> <!-- spring cloud alibaba 依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.1.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> </plugins> </build> <repositories> <repository> <id>public</id> <name>aliyun nexus</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>public</id> <name>aliyun nexus</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> </project> 3.2 搭建服务提供者创建名为 nacos-discovery-provider 的 Maven 子项目。 📜 修改 pom.xml 文件:<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>com.demo</groupId> <artifactId>nacos</artifactId> <version>1.0.0</version> </parent> <modelVersion>4.0.0</modelVersion> <packaging>jar</packaging> <artifactId>nacos-discovery-provider</artifactId> <description> 服务提供者 </description> <properties> <java.version>1.8</java.version> <!--编译项目不生成测试类也不进行测试--> <maven.test.skip>true</maven.test.skip> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- nacos 服务注册与发现依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 📜 创建 application.ymlserver: port: 18001 spring: application: # 应用名 name: nacos-provider cloud: nacos: discovery: # 注册中心地址 server-addr: 127.0.0.1:8848 # 连接注册中心的账号和密码 以下是默认账密 username: nacos password: nacos 📜 编写提供接口:@RestController @RequestMapping("api") public class IndexController { @RequestMapping("hello/{content}") public String hello(@PathVariable("content") String content){ return "hello,"+content; } }📜 修改启动类:@EnableDiscoveryClient @SpringBootApplication public class NacosDiscoveryProviderApplication { public static void main(String[] args) { SpringApplication.run(NacosDiscoveryProviderApplication.class, args); } }在启动类上添加@EnableDiscoveryClient注解。运行服务提供者,再次访问 🎈 http://localhost:8848/nacos ,效果图如下:至此服务注册成功。3.3 搭建服务消费者创建名为 nacos-discovery-consumer 的 Maven 项目。📜 修改 pom.xml 文件:<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>com.demo</groupId> <artifactId>nacos</artifactId> <version>1.0.0</version> </parent> <modelVersion>4.0.0</modelVersion> <packaging>jar</packaging> <artifactId>nacos-discovery-consumer</artifactId> <description> 服务消费者 </description> <properties> <java.version>1.8</java.version> <!--编译项目不生成测试类也不进行测试--> <maven.test.skip>true</maven.test.skip> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- ribbon 依赖,实现客户端负载均衡 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> <version>2.2.2.RELEASE</version> </dependency> <!-- nacos 服务注册与发现依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> ::(灯泡) 注意:SpringCloudAlibaba 依然采用 Ribbon 作为负载均衡客户端访问远程服务。 📜 创建 application.ymlserver: port: 28001 spring: application: # 应用名 name: nacos-consumer cloud: nacos: discovery: # 注册中心地址 server-addr: 127.0.0.1:8848 # 连接注册中心的账号和密码 以下是默认账密 username: nacos password: nacos 📜 创建消费接口:@RestController @RequestMapping("open") public class IndexController { @Autowired private RestTemplate restTemplate; @RequestMapping(value = "{content}") public String hello(@PathVariable String content) { // url = http://服务提供者的应用名称/接口名称/参数 return restTemplate.getForObject("http://nacos-provider/api/hello/" + content, String.class); } }📜 修改启动类@EnableDiscoveryClient @SpringBootApplication public class NacosDiscoveryConsumerApplication { public static void main(String[] args) { SpringApplication.run(NacosDiscoveryConsumerApplication.class, args); } @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } }在启动类上添加@EnableDiscoveryClient注解,同时创建RestTemplate实例并配置负载均衡。启动后,我们访问消费端接口 🎈 http://127.0.0.1:28001/open/Uncle ,结果如下图:消费者通过 Nacos 注册中心获取服务提供者的信息,成功调用其接口。更多详细资料请点击下方的链接进行查看。四、参考资料📣 Nacos 官网 📣 Nacos discovery wiki五、项目源码📣 源码
2023年07月26日
225 阅读
0 评论
0 点赞
2023-04-15
(亲测)Jrebel激活破解方式2019-08-21
1 . 打开jrebel 激活面板在上面的框中输入激活的url地址,下面的框中输入邮箱地址 , 可随意填 . 然后点击右下角的激活按钮即可最新激活地址 ,如果有个不行,试一下另外一个:http://jrebel.pyjuan.com/c95f8c2b-9e97-4bd4-b9bf-48ba24fc3a10 https://jrebel.qekang.com/bb25c9bf-7695-48d6-b1a0-baf893ca7631如果出现激活过期的情况下 , 可以重新生成一下GUID , 替换原来的GUID即可 . 在线生成GUID2 . 离线使用jrebel激活之后默认是联网使用的 , 在该模式下 , jrebel会一直联网监测激活信息 . 所以要调为离线使用的操作方法就是点击Work offile 按钮即可 .
2023年04月15日
4,289 阅读
3 评论
0 点赞
2023-03-14
MYSQL主从双向同步
修改A my.cnf # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci init-connect = 'SET NAMES utf8mb4' server-id = 2 #保持唯一 binlog-do-db = db1 #需要同步的binlog binlog-ignore-db = mysql#不需要同步的binlog #log-slave-updates slave-skip-errors=all replicate-do-db = db1 #需要同步的数据库 如果有多个可添加多个此项 replicate-ignore-db = mysql #不需要同步的数据库 如果需要多个可添加多个此项 #这样A的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID了 auto_increment_offset = 1 auto_increment_increment = 2 #slave_net_timeout这个参数究竟设置多少,要根据自己的mysql主库数据更新的频繁程度:主库数据更新频繁的,就将这个参数值设小点,更新不频繁就设大点。一般这个参数设置5s、10s、15s、20s、30s等等。 slave-net-timeout=5 #复制完的sql语句是否立即从中继日志中清除,1表示立即清除 relay-log-purge=1 [client] default-character-set=utf8mb4 [mysql] #设置mysql默认字符集 default-character-set=utf8mb4 修改B my.cnf # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci init-connect = 'SET NAMES utf8mb4' server-id = 3 #保持唯一 binlog-do-db = db1 #需要同步的binlog binlog-ignore-db = mysql#不需要同步的binlog #log-slave-updates slave-skip-errors=all replicate-do-db = db1 #需要同步的数据库 如果有多个可添加多个此项 replicate-ignore-db = mysql #不需要同步的数据库 如果需要多个可添加多个此项 auto_increment_offset = 2 auto_increment_increment = 2 slave-net-timeout=5 #复制完的sql语句是否立即从中继日志中清除,1表示立即清除 relay-log-purge=1 [client] default-character-set=utf8mb4 [mysql] #设置mysql默认字符集 default-character-set=utf8mb4 启动同步A执行# /usr/local/mysql/bin/mysql -u root -p mysql> show master status; 显示(当然这个是我机器的情况,你的不可能跟我一样哈,只是个例子): +------------------+----------+-------------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+-------------------+------------------+ | mysql-bin.000009 | 98 | discuz | mysql | +------------------+----------+-------------------+------------------+在B上执行# /usr/local/mysql/bin/mysql -u root -p mysql> slave stop; mysql> change master to master_host='192.168.1.123', master_user='back', master_password='back', master_log_file='mysql-bin.000009', master_log_pos=98; mysql> slave start; mysql> show slave status\G; Slave_IO_Running: Yes Slave_SQL_Running: Yes如果都是yes,那代表已经在同步设置双向同步将上一步反着重复操作一遍其他#启用从库日志,这样可以进行链式复制 log-slave-updates #从库是否只读,0表示可读写,1表示只读 read-only=1 #只复制某个表 replicate-do-table=tablename #只复制某些表(可用匹配符) replicate-wild-do-table=tablename% #只复制某个库 replicate-do-db=dbname #只复制某些库 replicte-wild-do-db=dbname% #不复制某个表 replicate-ignore-table=tablename #不复制某些表 replicate-wild-ignore-table=tablename% #不复制某个库 replicate-ignore-db=dbname #复制完的sql语句是否立即从中继日志中清除,1表示立即清除 relay-log-purge=1mysql主从复制异常Slave_IO_Running: NO的出现原因以及解决1.mysql5.6以上版本使用唯一uuid表示符,数据迁移是使用的物理备份,uuid会重复,修改uuid不一致即可造成这个错误的主要原因是使用主服务器克隆出来的虚拟机去实现mysql的主从复制解决办法:在主服务器和从服务器各运行一遍下面的代码对比server-uuid 是否一样,如果一样表示你有可能也是因为这个原因出错 cat /var/lib/mysql/auto.cnf 如果server-uuid一样删除auto.cnf文件 rm /var/lib/mysql/auto.cnf 重启mysql服务service mysqld restart 然后再重新进行一遍mysql主从复制的过程,因为地址可能会改变问题就解决啦,如果没有解决可以尝试从头开始。当然也有可能有其他的问题,这只是我自己这个情况的一个解决办法。确认server-id 是否唯一, mysql 有可能并没有加载my.cnf 文件中的server-id
2023年03月14日
150 阅读
0 评论
0 点赞
2023-02-27
安装及卸载NFS服务
centos 1) 安装步骤 # 服务端安装步骤 yum -y install rpcbind nfs-utils # 创建文件夹并赋权 mkdir /storage/data/ -p #如果出现挂载文件夹下面的文件找到不,记得给源添加权限 chmod 777 -R /storage/data/ vi /etc/exports #添加下行 /storage/data/ *(rw,sync,all_squash) # 使配置生效 exportfs -r # 启动服务 systemctl start rpcbind && systemctl start nfs # 设置开机启动 systemctl enable rpcbind && systemctl enable nfs # 检测 showmount -e 192.168.194.102 # 客户端安装步骤 yum -y install rpcbind # 检测 showmount -e 192.168.194.102 2) 卸载步骤 yum remove rpcbind nfs-utilsUbuntu 1) 安装步骤 # 服务端安装步骤 apt-get install nfs-kernel-server # 客户端安装步骤 sudo apt-get install nfs-common # 挂载 mount -t nfs 127.0.0.1:/data/nfs /data/testnfs # 卸载 umount /data/testnfs
2023年02月27日
570 阅读
0 评论
0 点赞
2023-02-16
Nginx负载均衡配置
服务准备配置相同的三个服务:IP:8001 、 IP:8002 、 IP:8003修改nginx配置文件vim /usr/local/nginx/conf/nginx.conf1.配置upstream,在 http {}里 新增 upstream 指向你启动的那三个后端服务。upstream [起一个自己容易辨识的名字:webname]{ server IP:8001; server IP:8002; server IP:8003; } 2.在 server {} 里添加一个location,并且配置 proxy_pass,(注意不要有同名的 比如已经有一个 location / 了,你再添加重启Nginx就会报错)location / { #转发到负载服务上 proxy_pass http://webname; } 完整配置如下: #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; pid /usr/local/nginx/logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; upstream webname{ server IP:8001; server IP:8002; server IP:8003; } server { listen 9600; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; # location / { #root html; #index index.html index.htm; #} location / { #转发到负载服务上 proxy_pass http://webname; } # location /test/api2 { # #转发到负载服务上 # proxy_pass http://webservers; # } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} } 3.重载配置# 重新加载(要到Nginx安装目录执行) ./nginx -s reload # 重新启动服务 (如果你添加了服务) systemctl restart nginx.service /usr/local/nginx/sbin/nginx -s reload 负载均衡配置ip_hash每个请求按访问IP的hash结果进行分配,这样每个访客就可以固定访问一个后端服务,一定程度上可以解决session问题;upstream webname { ip_hash; server IP:8001; server IP:8002; server IP:8003; } weightweight代表权重,默认为1,权重越高,被分配的客户端请求就会越多upstream webname { server IP:8001 weight=6; server IP:8002 weight=3; server IP:8003 weight=1; } fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的将会被优先分配upstream webname { server IP:8001; server IP:8002; server IP:8003; fair; } url_hash按访问URL的hash结果分配。这样相同的url会被分配到同一个节点,主要为了提高缓存命中率。比如,为了提高访问性能,服务端有大量数据或者资源文件需要被缓存。使用这种策略,可以节省缓存空间,提高缓存命中率upstream webname { hash &request_uri; server IP:8001; server IP:8002; server IP:8003; } least_conn按节点连接数分配,把请求优先分配给连接数少的节点。该策略主要为了解决,各个节点请求处理时间长短不一造成某些节点超负荷的情况。upstream webname { least_conn; server IP:8001; server IP:8002; server IP:8003; }
2023年02月16日
236 阅读
0 评论
0 点赞
2022-03-11
linux自动kill进程自动启动jar包脚本
start.sh#!/bin/bash NAME="xx.jar" #想要杀死的进程 PORT="8888" #端口 PROCESS="xx.jar" #jar包名称 LOGDIR="nohup.out" echo $NAME ID=`ps -ef |grep java|grep $NAME|grep -v grep|awk '{print $2}'` #注意此shell脚本的名称,避免自杀 if [ -z "$ID" ];then echo "process id is empty, process is not existed..." echo "process will start..." nohup java -Dserver.port=$PORT -jar -Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m $PROCESS > $LOGDIR 2>&1 & echo "process has start..." tail -f nohup.out else echo $ID for id in $ID do kill -9 $id echo "killed $id" done echo "process will restart..." nohup java -Dserver.port=$PORT -jar -Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m $PROCESS > $LOGDIR 2>&1 & echo "process has restart..." tail -f nohup.out fi
2022年03月11日
603 阅读
0 评论
0 点赞
2022-03-11
JAVA压缩图片质量大小,8M压缩到200K
以下方法避免了再linux上运行是提示java.lang.NoClassDefFoundError: com/sun/image/codec/jpeg/JPEGCodec异常 /** * 缩放图片(压缩图片质量,改变图片尺寸) * 若原图宽度小于新宽度,则宽度不变! * * @param newWidth 新的宽度 * @param quality 图片质量参数 0.7f 相当于70%质量 */ public static void imageResize(File originalFile, File resizedFile, int maxWidth, int maxHeight, float quality) throws IOException { if (quality > 1) { throw new IllegalArgumentException( "图片质量需设置在0.1-1范围"); } ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath()); Image i = ii.getImage(); Image resizedImage = null; int iWidth = i.getWidth(null); int iHeight = i.getHeight(null); int newWidth = maxWidth; if (iWidth < maxWidth) { newWidth = iWidth; } if (iWidth >= iHeight) { resizedImage = i.getScaledInstance(newWidth, (newWidth * iHeight) / iWidth, Image.SCALE_SMOOTH); } int newHeight = maxHeight; if (iHeight < maxHeight) { newHeight = iHeight; } if (resizedImage == null && iHeight >= iWidth) { resizedImage = i.getScaledInstance((newHeight * iWidth) / iHeight, newHeight, Image.SCALE_SMOOTH); } Image temp = new ImageIcon(resizedImage).getImage(); BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null), temp.getHeight(null), BufferedImage.TYPE_INT_RGB); Graphics g = bufferedImage.createGraphics(); g.setColor(Color.white); g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null)); g.drawImage(temp, 0, 0, null); g.dispose(); float softenFactor = 0.05f; float[] softenArray = {0, softenFactor, 0, softenFactor, 1 - (softenFactor * 4), softenFactor, 0, softenFactor, 0}; Kernel kernel = new Kernel(3, 3, softenArray); ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null); bufferedImage = cOp.filter(bufferedImage, null); FileOutputStream out = new FileOutputStream(resizedFile); //使用该方式避免linux异常 ImageIO.write(bufferedImage, "jpeg", out); // 以下方式本地执行正常,打包到服务器执行异常 // JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); // // JPEGEncodeParam param = encoder // .getDefaultJPEGEncodeParam(bufferedImage); // // param.setQuality(quality, true); // // encoder.setJPEGEncodeParam(param); // encoder.encode(bufferedImage); }
2022年03月11日
513 阅读
0 评论
0 点赞
2022-03-09
docker教程(八)安装harbor,对镜像仓库进行管理
笔者上篇说到搭建自己的 docker私服 用来管理自己的镜像,但是并没有UI界面及权限操作,这篇文章就是弥补这些问题。安装Harbor{card-list}{card-list-item}Harbor 项目是以 registry 为基础的镜像仓库,另外提供了管理 UI, 基于角色的访问控制(Role Based Access Control),AD/LDAP 集成、以及审计日志(Audit logging) 等企业用户需求的功能,同时还原生支持中文。可以说 Harbor 提供了完备的管理系统以弥补 registry 的不足。在资源占用方面 Harbor 也比较小。{/card-list-item}{/card-list}下载可以去 Github 中下载 下载完上传到服务器解压,这里笔者安装的是V1.10.10,可根据自己的选择安装其他版本配置解压之后会有一个harbor目录,中间有harbor.yml.tml 和 install.sh。 harbor.yml.tml 是配置文件模板,需要将此文件改为 harbor.yml,部署时会使用 harbor.yml 配置文件。 install.sh 是执行文件,执行此文件就可以进行部署。 对yml参数进行修改:# 设置访问地址,可以使用ip、域名,不可以设置为127.0.0.1或localhost。 # 访问地址 hostname: harbor.maven.vip # HTTP 访问协议设置 http: # http访问端口号 port: 88 # 禁用HTTPS协议访问 #https: # https port for harbor, default is 443 # port: 443 # The path of cert and key files for nginx # certificate: /your/certificate/path # private_key: /your/private/key/path # admin 用户密码 harbor_admin_password: XXXXXXX # 数据库设置 database: # 数据库密码 password: XXXXXX # Harbor数据挂载目录 data_volume: /volumes/harbor 部署修改为配置文件之后,执行install.sh文件进行部署。 部署的时候可能会遇见文件夹不存在等问题,可以一步步自己建好,再尝试install.sh访问部署完成之后,根据之前配置ip和端口进行访问。 账号默认admin,密码也是之前配置 推送登录之后可以再项目定额看到仓库名称 #查看镜像 docker images #登录 docker login -u [harbor账号] -p [harbor密码] ip:port #推送镜像 docker tag [选中的镜像名称] [重新定义镜像名称为:ip:port/library/镜像名称:版本] docker push [ip:port/library/镜像名称:版本] #拉取镜像 docker pull [ip:port/library/镜像名称:版本]推送成功之后就可以在这里管理
2022年03月09日
415 阅读
0 评论
0 点赞
2022-03-05
docker教程(七)搭建自己的docker私服
前提至于笔者为什么会写这篇文章,是因为共有docker服务的速度慢而且不私有,所以在自己设备上安装,以便对常用的镜像进行操作。如果对命令不是很熟悉的小伙伴,可以看看之前的文章来操作镜像和容器 《镜像、容器操作命令》镜像安装docker pull registry通过命令查看现有镜像docker images后台启动容器,因为服务的默认端口是5000,而笔者本地已经5000端口已经占用了,所以指定了88端口。启动后访问http://ip:88/v2/_catalog成功就说明安装成功了docker run -dp 88:88 registry查看容器docker ps镜像推送以下以star7th/showdoc推送为例docker push 127.0.0.1:88/uncle/star7th/showdoc #uncle为自己指定的仓库 #因为是本地推送,所以笔者用的是127.0.0.1,如果配置了域名的小伙伴也可以用域名 #执行后一般会提示出现错误,因为服务默认的仓库是镜像仓库是dockerhub,uncle/star7th/showdoc相当于docker.io/uncle/star7th/showdoc #因此,想要将镜像推送到私服仓库中,需要修改镜像标签。 The push refers to repository [127.0.0.1:88/uncle/star7th/showdoc] An image does not exist locally with the tag: 127.0.0.1:88/uncle/star7th/showdoc 修改镜像标签重新推送,走到这一步,镜像就推送成功了docker tag star7th/showdoc 127.0.0.1:88/uncle/showdoc docker push 127.0.0.1:88/uncle/showdoc常用的请求URL{card-list}{card-list-item}查看私服镜像所有仓库http://localhost:5000/v2/_catalog查看仓库中镜像的所有标签列表,以xzxiaoshan/frps为例http://localhost:5000/v2/xzxiaoshan/frps/tags/list更多操作请看官网描述https://docs.docker.com/registry/spec/api/{/card-list-item}{/card-list}修改容器连接Error response from daemon: Get "https://*:88/v2/": http: server gave HTTP response to HTTPS clientvim /etc/docker/daemon.json #内容加入 {"insecure-registries":["填你的服务器地址"]}
2022年03月05日
297 阅读
0 评论
0 点赞
1
2
...
24