首页
友链
关于
免责声明
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
分享
群辉
页面
友链
关于
免责声明
搜索到
195
篇与
后端
的结果
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 点赞
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-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 点赞
2022-01-12
Graphics2D 图片上绘制文字,并设置文字边框
代码实例 // 读取原图片信息 //得到文件 File file = new File("d:\\1.png"); //文件转化为图片 Image srcImg = ImageIO.read(file); //获取图片的宽 int srcImgWidth = srcImg.getWidth(null); //获取图片的高 int srcImgHeight = srcImg.getHeight(null); BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB); Graphics2D g2 = bufImg.createGraphics(); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); g2.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY); FontRenderContext frc = g2.getFontRenderContext(); TextLayout tl = new TextLayout("你好", new Font("黑体", Font.BOLD, 25), frc); //文字所在位置 Shape sha = tl.getOutline(AffineTransform.getTranslateInstance(690,390)); g2.setStroke(new BasicStroke(3.0f)); //边框颜色 g2.setColor(new Color(178, 113, 23)); g2.draw(sha); //字体颜色 g2.setColor(Color.WHITE); g2.fill(sha); g2.dispose(); ByteArrayOutputStream bs = new ByteArrayOutputStream(); ImageOutputStream imOut = ImageIO.createImageOutputStream(bs); ImageIO.write(bufImg, "png", imOut); InputStream inputStream = new ByteArrayInputStream(bs.toByteArray()); OutputStream outStream = new FileOutputStream("d:\\3.png"); IOUtils.copy(inputStream, outStream); inputStream.close(); outStream.close();
2022年01月12日
454 阅读
0 评论
0 点赞
2022-01-12
Graphics2D 在一张图片上添加一个带有透明背景的图片或绘制透明图片
代码实例 // 读取原图片信息 底图 //得到文件 File file = new File("d:\\1.png"); //文件转化为图片 Image srcImg = ImageIO.read(file); //获取图片的宽 int srcImgWidth = srcImg.getWidth(null); //获取图片的高 int srcImgHeight = srcImg.getHeight(null); // 加水印 BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB); Graphics2D gs = bufImg.createGraphics(); //得到带有透明背景的图片 Image ima=ImageIO.read(new File("d:\\2.png")); BufferedImage bi=new BufferedImage(ima.getWidth(null),ima.getHeight(null),BufferedImage.TYPE_INT_BGR); Graphics2D gg=bi.createGraphics(); bi= gg.getDeviceConfiguration().createCompatibleImage(ima.getWidth(null), ima.getHeight(null), Transparency.TRANSLUCENT); gg = bi.createGraphics(); gg.drawImage(ima, 0, 0, null); gg.dispose(); //将透明背景图绘制到底图上 // 第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y) gs.drawImage(bi, 605, 148,null); gs.dispose(); ByteArrayOutputStream bs = new ByteArrayOutputStream(); ImageOutputStream imOut = ImageIO.createImageOutputStream(bs); ImageIO.write(bufImg, "png", imOut); InputStream inputStream = new ByteArrayInputStream(bs.toByteArray()); OutputStream outStream = new FileOutputStream("d:\\3.png"); IOUtils.copy(inputStream, outStream); inputStream.close(); outStream.close();绘制透明图片 int width=256; int height=256; //创建BufferedImage对象 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取Graphics2D Graphics2D g2d = image.createGraphics(); // 增加下面代码使得背景透明 image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT); g2d.dispose(); g2d = image.createGraphics(); // 释放对象 g2d.dispose(); // 保存文件 ImageIO.write(image, "png", new File("D:/test.png"));
2022年01月12日
257 阅读
0 评论
0 点赞
2022-01-12
Graphics2D 图片上添加图片或绘制二维码
代码实例 // 读取原图片信息 //得到文件 File file = new File("d:\\1.png"); //文件转化为图片 Image srcImg = ImageIO.read(file); //获取图片的宽 int srcImgWidth = srcImg.getWidth(null); //获取图片的高 int srcImgHeight = srcImg.getHeight(null); // 加水印 BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB); Graphics2D g = bufImg.createGraphics(); g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null); //使用工具类生成二维码 Image image = createQrCode("二维码内容", 226, 226, "二维码中间logo图片地址"); //将小图片绘到大图片上,表示你的小图片在大图片上的位置。 g.drawImage(image, 263, 700, null); //或者将图片绘制上去 File file = new File("d:\\2.png"); BufferedImage read = ImageIO.read(file); Graphics2D k = bufImg.createGraphics(); //将小图片绘到大图片上,表示你的小图片在大图片上的位置。 k.drawImage(read, 650, 188, 150,150,null); k.setColor(Color.WHITE); k.dispose(); //设置颜色。 g.setColor(Color.WHITE); g.dispose(); ByteArrayOutputStream bs = new ByteArrayOutputStream(); ImageOutputStream imOut = ImageIO.createImageOutputStream(bs); ImageIO.write(bufImg, "png", imOut); InputStream inputStream = new ByteArrayInputStream(bs.toByteArray()); OutputStream outStream = new FileOutputStream("d:\\3.png"); IOUtils.copy(inputStream, outStream); inputStream.close(); outStream.close(); private static BufferedImage createQrCode(String content, int width, int height, String logoPath) throws IOException { QrConfig config = new QrConfig(width, height); if (logoPath != null) { Image image = ImageIO.read(new FileInputStream(new File(logoPath))); config.setImg(image); } config.setErrorCorrection(ErrorCorrectionLevel.H); return QrCodeUtil.generate( content, config); }二维码生成工具引用 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.2.4</version> </dependency>
2022年01月12日
501 阅读
0 评论
0 点赞
2021-12-19
JAVA王者荣耀营地数据解析
根据营地号获取王者荣耀战绩、皮肤、英雄数据,提供营地号查询接口 营地数据解析 源码下载
2021年12月19日
2,748 阅读
2 评论
3 点赞
1
2
...
20