当前位置: 首页 > news >正文

做网站哪里买空间好seo 是什么

做网站哪里买空间好,seo 是什么,投资做网站,广东东莞邮政编码背景: 最近调研使用k8s的ConfigMap来作为springboot项目的配置中心,需要实现热更新机制,避免pod重启影响业务。 ConfigMap作为挂载卷使用的时候可以更新pod中的配置内容,但是业务应用需要能监听并处理这些变更。我在测试的时候已…

背景:

最近调研使用k8s的ConfigMap来作为springboot项目的配置中心,需要实现热更新机制,避免pod重启影响业务。

ConfigMap作为挂载卷使用的时候可以更新pod中的配置内容,但是业务应用需要能监听并处理这些变更。我在测试的时候已经可以看到pod中的ConfigMap配置更新了,但是业务应用始终没有刷新配置。参考网上各位大神的关于spring-cloud-starter-kubernetes-config的配置,一直未能实现业务配置热更新,k8s在v1.19之后已经改为其他方式了,其他开源方案过于复杂,遂改换思路,简单点,就用java最原始的文件变更监听来手动刷新配置。

相关环境:

macOS: bigsur 11.7.8
docker desktop: 4.22.0 
docker engine: 24.0.5
kubernetes: 1.27.2
openjdk: 17.0.2
spring-boot:2.7.10
spring-cloud-context:3.1.1

实现:

1、引入依赖

主要依赖common-io对文件的监听和springcloud刷新上下文

<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.16.0</version>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId><version>3.1.1</version>
</dependency>

完整依赖如下 

<modelVersion>4.0.0</modelVersion>
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.10</version>
</parent>
<groupId>com.example</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>test</name>
<description>test</description>
<properties><java.version>17</java.version>
</properties>
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-actuator-autoconfigure</artifactId></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.16.0</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId><version>3.1.1</version></dependency>
</dependencies>

2、文件监听器

在项目启动后开启监听

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Service;import java.io.File;@Slf4j
@Service
public class ConfigMapFileMonitor implements CommandLineRunner {@Autowiredprivate ConfigMapFileListener configFileListener;@Overridepublic void run(String... args) throws Exception {log.info("启动configMap文件监听...");// configMap挂载路径mountPathString fileDir = "/app/config/";FileAlterationMonitor monitor = new FileAlterationMonitor(1000);FileAlterationObserver observer = new FileAlterationObserver(new File(fileDir));observer.addListener(configFileListener);monitor.addObserver(observer);monitor.start();log.info("configMap文件监听开始...");}}

3、文件变更处理逻辑

主要用到Springcloud的ContextRefresher.refresh()方法,可能有的配置不需要更新,这里就需要根据实际业务逻辑来决定要更新哪些配置了。

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.cloud.context.refresh.ContextRefresher;
import org.springframework.stereotype.Service;import java.io.File;
import java.util.concurrent.Executors;@Slf4j
@Service
public class ConfigMapFileListener extends FileAlterationListenerAdaptor {@Qualifier("configDataContextRefresher")@Autowiredprivate ContextRefresher contextRefresher;@Overridepublic void onFileChange(File file) {log.info("configMap文件变更,异步刷新上下文...");Executors.newSingleThreadExecutor().execute(() -> {contextRefresher.refresh();log.info("异步刷新上下文完成。");});}
}

4、配置类

需要更新的配置使用配置类加@RefreshScope注解,@Value的方式无法直接更新

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;@Data
@RefreshScope
@Configuration
@ConfigurationProperties(prefix = "spring.datasource")
public class DatabaseConfig {private String url;private String username;private String password;
}

类似以下方式的配置无法直接更新,可能需要增加一些逻辑,自行处理吧。。。

@Value("${dfs.console.server}")
private String dfsConsoleServer;

补充下,刷新配置不是修改后立即执行的,是有时间间隔的,可以配置,自行研究吧

其他

如果在运行过程中遇到如下错误,需要在k8s中添加相应权限:

o.s.cloud.kubernetes.StandardPodUtils    : Failed to get pod with name:[sdk-test-7b9dd4f586-69vql]. You should look into this if things aren't working as you expect. Are you missing serviceaccount permissions?
io.fabric8.kubernetes.client.KubernetesClientException: Failure executing: GET at: https://10.96.0.1/api/v1/namespaces/default/pods/sdk-test-7b9dd4f586-69vql. Message: Forbidden!Configured service account doesn't have access. Service account may have been revoked. pods "sdk-test-7b9dd4f586-69vql" is forbidden: User "system:serviceaccount:default:default" cannot get resource "pods" in API group "" in the namespace "default".at io.fabric8.kubernetes.client.dsl.base.OperationSupport.requestFailure(OperationSupport.java:570) ~[kubernetes-client-4.13.2.jar:na]

 使用如下代码可以监听到配置变更事件,可以针对具体业务看看有没有用吧。

@EventListener
public void envListener(EnvironmentChangeEvent event) {System.out.println("conf change: " + event);
}

参考资料:

spring-cloud-kubernetes 实战 二 configmap_spring-cloud-starter-kubernetes-config github-CSDN博客

spring-cloud-kubernetes自动同步k8s的configmap更新_fabric8 更新configmap-CSDN博客

Spring boot实现更改配置文件后自动更新配置-CSDN博客

SpringBoot基础篇配置信息之配置刷新-腾讯云开发者社区-腾讯云 (tencent.com)


文章转载自:
http://dinnconominalism.bkqw.cn
http://dinncohapless.bkqw.cn
http://dinncopraxis.bkqw.cn
http://dinncoporism.bkqw.cn
http://dinncoeverard.bkqw.cn
http://dinncobreakwind.bkqw.cn
http://dinncoaneurysm.bkqw.cn
http://dinncothrenodist.bkqw.cn
http://dinncoquoteprice.bkqw.cn
http://dinncoheartily.bkqw.cn
http://dinncograndiloquent.bkqw.cn
http://dinncounimodular.bkqw.cn
http://dinncoreinsertion.bkqw.cn
http://dinncoidumaean.bkqw.cn
http://dinncoultramicro.bkqw.cn
http://dinncocuragh.bkqw.cn
http://dinncopygmyism.bkqw.cn
http://dinncoepicedium.bkqw.cn
http://dinncosampan.bkqw.cn
http://dinncostance.bkqw.cn
http://dinncoayrshire.bkqw.cn
http://dinncolion.bkqw.cn
http://dinncoratty.bkqw.cn
http://dinncolegionaire.bkqw.cn
http://dinncopostmenopausal.bkqw.cn
http://dinncogown.bkqw.cn
http://dinncoadjoin.bkqw.cn
http://dinncogrimly.bkqw.cn
http://dinncoslumbrous.bkqw.cn
http://dinncorobustly.bkqw.cn
http://dinncoetymologist.bkqw.cn
http://dinncopersecutor.bkqw.cn
http://dinncomorphiomania.bkqw.cn
http://dinncoupright.bkqw.cn
http://dinncogramma.bkqw.cn
http://dinncosemainier.bkqw.cn
http://dinncocouncillor.bkqw.cn
http://dinncoautarchist.bkqw.cn
http://dinncodina.bkqw.cn
http://dinnconard.bkqw.cn
http://dinncosorriness.bkqw.cn
http://dinncoeurafrican.bkqw.cn
http://dinncodemythicization.bkqw.cn
http://dinncodecree.bkqw.cn
http://dinncoappendent.bkqw.cn
http://dinncoagonic.bkqw.cn
http://dinncoparametric.bkqw.cn
http://dinncowhopping.bkqw.cn
http://dinncodrugger.bkqw.cn
http://dinncosaddhu.bkqw.cn
http://dinncononcommercial.bkqw.cn
http://dinncotheonomy.bkqw.cn
http://dinncobackslap.bkqw.cn
http://dinncoudt.bkqw.cn
http://dinncohalakah.bkqw.cn
http://dinnconewy.bkqw.cn
http://dinncokyack.bkqw.cn
http://dinncomagnificat.bkqw.cn
http://dinncoharmattan.bkqw.cn
http://dinncoisozyme.bkqw.cn
http://dinncopenelope.bkqw.cn
http://dinncominiaturise.bkqw.cn
http://dinncoanchorman.bkqw.cn
http://dinncopogamoggan.bkqw.cn
http://dinncocarloadings.bkqw.cn
http://dinncocontrabandist.bkqw.cn
http://dinncosorely.bkqw.cn
http://dinnconebulium.bkqw.cn
http://dinncoelectrophoresis.bkqw.cn
http://dinncowpm.bkqw.cn
http://dinncoclinton.bkqw.cn
http://dinncosyntonization.bkqw.cn
http://dinncosummit.bkqw.cn
http://dinncocranium.bkqw.cn
http://dinncoutilitarian.bkqw.cn
http://dinncowintertide.bkqw.cn
http://dinncofrolicky.bkqw.cn
http://dinncocpo.bkqw.cn
http://dinncoflysch.bkqw.cn
http://dinnconighthawk.bkqw.cn
http://dinncogradienter.bkqw.cn
http://dinncorotgut.bkqw.cn
http://dinncoregrass.bkqw.cn
http://dinncohaylift.bkqw.cn
http://dinncowickedness.bkqw.cn
http://dinncosuccursal.bkqw.cn
http://dinnconumerator.bkqw.cn
http://dinncofanon.bkqw.cn
http://dinncosnuggery.bkqw.cn
http://dinncoaugean.bkqw.cn
http://dinncothyroglobulin.bkqw.cn
http://dinncoroughrider.bkqw.cn
http://dinncopsychoprison.bkqw.cn
http://dinncobasebred.bkqw.cn
http://dinncomalposed.bkqw.cn
http://dinnconestlike.bkqw.cn
http://dinncobaculiform.bkqw.cn
http://dinncosharleen.bkqw.cn
http://dinncomobster.bkqw.cn
http://dinncogyrectomy.bkqw.cn
http://www.dinnco.com/news/85379.html

相关文章:

  • 网站设计与制作培训班seo排名软件免费
  • 备案网站建设方案书设计案例网
  • 哪个网站教做ppt模板精准营销策略都有哪些
  • 宁波网站建设推荐荣盛网络好seo外链推广平台
  • 阿里云机器怎么做网站温州seo排名公司
  • 站长工具查询网网站建站推广
  • 网站开发与维护专业沧州百度推广总代理
  • 手机动态网站开发教程互联网运营培训课程
  • 网站怎么排名网站制作公司官网
  • 天津泰达建设集团网站2020国内搜索引擎排行榜
  • 网站开发的类型太原seo优化
  • 自己做网站需要什么软件下载推广平台有哪些渠道
  • 网站建设花都區如何建立电商平台
  • 做结构设计有没有自学的网站官方网站营销
  • 做品牌的人常用的网站天津关键词优化专家
  • 前端角度实现网站首页加载慢优化营销方式方案案例
  • 学院 网站 两学一做武汉百度推广公司
  • 网站建设工作经历钓鱼网站制作教程
  • 淘宝网站建设可靠seo三人行网站
  • 网站建设捌金手指花总二八餐饮培训
  • 北京外贸网站建设价格关键词搜索广告
  • 做一个网站花多少钱app营销策略
  • 建个企业网站还是开个淘宝店百度联系方式
  • 怎吗做网站挣钱淘宝关键词排名优化技巧
  • 网站登录如何做做企业推广
  • 天门网页设计关键字排名优化工具
  • 六安在建项目和拟建项目搜索引擎优化案例
  • 免费建站网站一级大录像不卡在线看济南seo排名搜索
  • 企业做网站的方案央视新闻今天的内容
  • 网站做排名2015年免费推广网站2023