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

Apollo在Java中的使用

   本节主要讲解在普通的 Java 项目和 Spring Boot 中如何使用 Apollo。

 普通 Java 项目中使用
加入 Apollo Client 的 Maven 依赖,代码如下所示。

<dependency><groupId>com.ctrip.framework.apollo</groupId><artifactId>apollo-client</artifactId><version>1.1.0</version>
</dependency>

使用 API 的方式来获取配置,具体代码如下所示。

public class App {public static void main(String[] args) {Config config = ConfigService.getAppConfig();String key = "username";String defaultValue = "张三";String username = config.getProperty(key, defaultValue);System.out.println("username=" + username);}
}

通过 ConfigService 得到 Config 对象,config.getProperty() 方法可以传入你想获取的配置 Key,defaultValue 是当配置中心找不到配置的时候返回的默认值,避免空指针异常。

运行上面这段代码,输出的结果是默认值“张三”。因为我们还没有指定 Apollo 需要的一些必要信息,这些信息包括 Meta Server、AppId 和 Environment。Cluster 可以不用指定,用默认即可。

1.Meta Server 配置
Apollo 支持应用在不同的环境中有不同的配置,所以需要运行提供给 Apollo 客户端当前环境的 Apollo Meta Server 信息。
在默认情况下,meta server 和 config service 是部署在同一个 JVM 进程里的,所以 meta server 的地址就是 config service 的地址。

目前我们用的快速启动包只有一个 DEV 环境,config service 的地址是 http://localhost:8080,这个已经在启动脚本 demo.sh 中定义好了。

为了能够让示例代码在各位读者的电脑上也能直接运行,我们将配置定在 classpath:/META-INF/app.properties 中。内容为 apollo.meta=http://localhost:8080。

2.APPid 配置
APPid 是应用的身份信息,是从服务端获取配置的一个重要信息。同样 APPid 的配置方式也有多种,我们采用跟 Meta Server 一样的方式,配置在 classpath:/META-INF/app.properties 中。内容为 app.id=SampleApp。
SampleApp 在 Portal 的项目主页面中有展示,如果是你自己新建的项目,那么就是你自定义的 AppId。

3.Environment 配置
Environment 跟项目本身没有关系,一个项目可以部署在不同的环境中,代码不需要改变,需要变化的只是配置值而已。所以 Environment 的配置不能配置在项目中,最常用的有如下两种配置方式。
1)通过 Java System Property
可以通过 Java 的 System Property env 来指定环境。
在 Java 程序启动脚本中,可以指定 -Denv=YOUR-ENVIRONMENT。
如果是运行 jar 文件,需要注意格式为 java-Denv=YOUR-ENVIRONMENT-jar xxx.jar。
注意 key 为全小写。
2)通过配置文件
最后一个推荐的方式是通过配置文件来指定 env=YOUR-ENVIRONMENT。
对于 Mac/Linux,文件位置为 /opt/settings/server.properties。
对于 Windows,文件位置为 C:\opt\settings\server.properties。

server.properties 内容为 env=DEV。

同样的,为了能够让示例代码能够更方便地在各位读者的电脑上运行,我们就用 ava System Property 的方式来指定 Environment,要么在 IDE 的启动参数中指定,要么就在 main 方法的第一行通过代码指定(仅供开发演示用,不能用于生产环境)。具体代码所示。
 

public static void main(String[] args) {System.setProperty("env", "DEV");// ....
}

所有配置完成之后,我们再次运行前面的示例代码,可以看到输出的内容就是我们自己配置的值。4.监听配置变化事件
在某些场景下,当配置发生变化的时候,我们需要进行一些特殊的处理。比如,数据库连接串变化后需要重建连接等,就可以使用 API 提供的监听机制。具体代码如下所示。

config.addChangeListener(new ConfigChangeListener() {public void onChange(ConfigChangeEvent changeEvent) {System.out.println("发生修改数据的命名空间是:" + changeEvent.getNamespace());for (String key : changeEvent.changedKeys()) {ConfigChange change = changeEvent.getChange(key);System.out.println(String.format("发现修改 - 配置key: %s, 原来的值: %s, 修改后的值: %s, 操作类型: %s", change.getPropertyName(),change.getOldValue(), change.getNewValue(), change.getChangeType()));}}
});

当我们在 Portal 中进行修改配置时,就会触发监听事件,输出结果为:

发生修改数据的命名空间是:application
发现修改 - 配置key: username, 原来的值: zhangsan, 修改后的值: zhangsan1, 操作类型: MODIFIED

 Spring Boot 中使用
首先准备一个 Spring Boot 项目,加入 Apollo Client 的 Maven 依赖,具体代码如下所示:

<dependency><groupId>com.ctrip.framework.apollo</groupId><artifactId>apollo-client</artifactId><version>1.1.0</version>
</dependency>

 然后配置 Apollo 的信息,配置放在 application.properties 中:

app.id=SampleApp
apollo.meta=http://localhost:8080
apollo.bootstrap.enabled=true
apollo.bootstrap.namespaces=application

其中,

app.id:身份信息。
apollo.meta:Meta Server(Config Service)。
apollo.bootstrap.enabled:项目启动的 bootstrap 阶段,向 Spring 容器注入配置信息。
apollo.bootstrap.namespaces:注入命名空间。
环境同样在 main 方法中指定,代码如下所示。
 

@SpringBootApplication
public class App {public static void main(String[] args) {// 指定环境(仅供开发演示用, 不能用于生产环境))System.setProperty("env", "DEV");SpringApplication.run(App.class, args);}
}
  1. Placeholder 注入配置
    Placeholder 注入配置代码如下所示。
    /**
    * 用户名, 默认值为zhangsan
    */
    @Value("${username:zhangsan}")
    private String username;
    

  2. Java Config 使用方式
    Java Config 使用方式具体代码如下所示。
@Data
@Configuration
public class UserConfig {@Value("${username:zhangsan}")private String username;
}

 使用 Config 配置类注入具体代码如下所示:

@Autowired
private UserConfig userConfig;

3.ConfigurationProperties 使用方式
ConfigurationProperties 的使用方法具体代码如下所示。

@Data
@Configuration
@ConfigurationProperties(prefix = "redis.cache")
public class RedisConfig {private String host;
}

配置中心只需要增加 redis.cache.host 配置项即可实现注入,配置内容如下:

redis.cache.host = 192.168.1.1

ConfigurationProperties 方式有个缺点,当配置的值发生变化时不会自动刷新,而是需要手动实现刷新逻辑,笔者建议大家不要使用这种方式,比较繁琐。

如果有配置需要加统一前缀的方式可以用 Java Config 的方式代替。

4.Spring Annotation 支持
1)@ApolloConfig
用来自动注入 Apollo Config 对象,代码如下所示。
 

@ApolloConfig
private Config config;
@GetMapping("/config/getUserName3")
public String getUserName3() {return config.getProperty("username", "zhangsan");
}

2)@ApolloConfigChangeListener
用来自动注册 ConfigChangeListener,代码如下所示。

@ApolloConfigChangeListener
private void someOnChange(ConfigChangeEvent changeEvent) {if(changeEvent.isChanged("username")) {System.out.println("username发生修改了");}
}

3)@ApolloJsonValue
用来把配置的 JSON 字符串自动注入为对象。

定义一个实体类,代码如下所示。

@Data
public class Student {private int id;private String name;
}

对象注入,代码如下所示。

@ApolloJsonValue("${stus:[]}")
private List<Student> stus;

后台增加配置内容如下:

stus = [{"id":1,"name":"jason"}]

相关文章:

Apollo在Java中的使用

本节主要讲解在普通的 Java 项目和 Spring Boot 中如何使用 Apollo。 普通 Java 项目中使用 加入 Apollo Client 的 Maven 依赖&#xff0c;代码如下所示。 <dependency><groupId>com.ctrip.framework.apollo</groupId><artifactId>apollo-client<…...

Elasticsearch 全文搜索引擎 ---- IK分词器

原理&#xff1a;分词的原理&#xff1a;二叉树 首先讲一下为什么要出这个文章&#xff0c;前面我们讲过分词方法&#xff1a;中文分词搜索 pscws&#xff08;感兴趣的同学可以去爬楼看一下&#xff09;&#xff0c;那为什么要讲IK分词&#xff1f;最主要的原因是&…...

Layer 2盛夏已至,StarkNet如何实现价值跃迁?

作者&#xff5c;Jason Jiang Layer 2概念在2023年夏天迎来爆发。Coinbase、ConsenSys等加密巨头纷纷下场&#xff0c;其部署的原生L2解决方案Base、Linea在过去两个月内相继完成主网上线&#xff1b;被誉为L2 四大天王之一的StarkNet也在夏天顺利完成“量子跃迁”升级&#x…...

KaiwuDB 受邀亮相 2023 中国国际“软博会”

8月31日&#xff0c;第二十五届中国国际软件博览会&#xff08;以下简称“软博会”&#xff09;在天津盛大开幕。KaiwuDB 受邀亮相展会&#xff0c;围绕“塑造软件新生态&#xff0c;赋能发展新变革”主题&#xff0c;重点展示自研分布式多模数据库及各大行业解决方案&#xff…...

RS-485/RS-422收发器电路 DP3085 国产低成本替代MAX3085

DP3085是5V、半双工、15kV ESD 保护的 RS-485/RS-422 收发器电路&#xff0c;电路内部包含一路驱动器和一路接收器。 DP3085具有增强的摆率限制&#xff0c;助于降低输出 EMI 以及不匹配的终端连接引起的反射&#xff0c;实现 500kbps 的无误码数据传输。 DP3085芯片接收器输入…...

R-which函数(带有arr.ind参数)

目录 一、which()函数 二、元素位置 一、which()函数 which()函数是R语言中的一个基础函数&#xff0c;用于返回满足指定条件的元素的位置或索引。 语法&#xff1a;which(x, arr.ind FALSE, useNames TRUE) 参数&#xff1a; - x&#xff1a;一个向量、数组或矩阵&#x…...

单片机通用学习-什么是时钟?

什么是时钟&#xff1f; 时钟是同步单片机系统各个部件工作时序的最小时间单位&#xff0c;时钟通过 CPU 控制&#xff0c;产生其他与时钟保持一定关系的同步控制信号&#xff0c;协调各部件的工作时序&#xff0c;没有时钟系统就崩溃了。 如 CPU 与存储器&#xff08;RAM&am…...

PCL入门(二):初识点云数据

目录 1. 点云数据2. 对点云数据的简单操作3. 结果 1. 点云数据 在pcl里面&#xff0c;定义了很多点云数据类型&#xff0c;比如PointXYZ、PointXYZI、PointXYZRGBA等等&#xff0c;每一个都可以看做是点云的一个点的数据。而整个点云的数据类型被定义为PointCloud。 以pcl::P…...

LeetCode 面试题 03.01. 三合一

文章目录 一、题目二、C# 题解 一、题目 三合一。描述如何只用一个数组来实现三个栈。 你应该实现push(stackNum, value)、pop(stackNum)、isEmpty(stackNum)、peek(stackNum)方法。stackNum表示栈下标&#xff0c;value表示压入的值。 构造函数会传入一个stackSize参数&#x…...

【WebSocketIndexedDB】node+WebSocketIndexedDB开发简易聊天室

序幕介绍&#xff1a; WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 讲人话就是说&#xff1a;WebSocket 使得客户端和服务器之间的数据交换变得更加简单&#xff0c;在 WebSocket API 中&#xff0c;浏览器和服务器只需要完成一次握手&#x…...

【01】弄懂共识机制PoW

基于工作量证明机制的共识机制PoW&#xff08;Proof of Work&#xff09; 特点就是多劳多特 共识过程 一个区块链系统中&#xff0c;交易历经多个步骤才能得以上链&#xff0c;并且需要经过多个节点的验证。以下是这些步骤的详细叙述&#xff1a; 交易进入交易池&#xff08;内…...

QT C++ 基于TCP通信的网络聊天室

一、基本原理及流程 1&#xff09;知识回顾&#xff08;C语言中的TCP流程&#xff09; 2&#xff09;QT中的服务器端/客户端的操作流程 二、代码实现 1&#xff09;服务器 .ui .pro 在pro文件中添加network库 .h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>…...

SpringMVC入门详细介绍

一. SpringMVC简介 Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;通过把Model&#xff0c;View&#xff0c;Controller分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂的web应用分成逻辑清晰的几部分&#xff0c;简化开发&a…...

R3LIVE源码解析(9) — R3LIVE中r3live_lio.cpp文件

目录 1 r3live_lio.cpp文件简介 2 r3live_lio.cpp源码解析 1 r3live_lio.cpp文件简介 在r3live.cpp文件中创建LIO线程后&#xff0c;R3LIVE中的LIO线程本质上整体流程和FAST-LIO2基本一致。 2 r3live_lio.cpp源码解析 函数最开始会进行一系列的声明和定义&#xff0c;发布的…...

如何高效的解析Json?

Json介绍 Json是一种数据格式&#xff0c;广泛应用在需要数据交互的场景Json由键值对组成每一个键值对的key是字符串类型每一个键值对的value是值类型(boo1值数字值字符串值)Array类型object类型Json灵活性他可以不断嵌套&#xff0c;数组的每个元素还可以是数组或者键值对键值…...

MySQL——分组查询

2023.9.4 MySQL 分组查询的学习笔记如下&#xff1a; #分组查询 /* 分组查询中的筛选条件分为两类&#xff1a;数据源 位置 关键字 分组前筛选 原始表 group by前面 where 分组后筛选 分组后的结果集 group by后面 having */ #查询每…...

thinkphp 使用 easypay 和 easywechat

easypay 是3.x easywechat 是6.x 引入&#xff1a; use Yansongda\Pay\Pay;//easypayuse EasyWeChat\MiniApp\Application as MiniApp;//easywechat use EasyWeChat\Pay\Application as Payapp;//easywechat public function suborder(){$order [out_trade_no > time(…...

无涯教程-JavaScript - DVARP函数

描述 DVARP函数通过使用列表或数据库中符合您指定条件的记录的字段(列)中的数字,基于整个总体计算总体的方差。 语法 DVARP (database, field, criteria)争论 Argument描述Required/Optionaldatabase 组成列表或数据库的单元格范围。 数据库是相关数据的列表,其中相关信息的…...

Databend 开源周报第 108 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 多源数据目录 …...

Android-Intent实现数据传递

在activityA中使用putExtras(bundle)传递数据&#xff0c;在activityB中使用getExtras()获取数据 MainActivity.java及其xml package com.example.intentactivity;import androidx.appcompat.app.AppCompatActivity;import android.content.ComponentName; import android.co…...

【NotebookLM隐私风险等级评估】:基于NIST SP 800-53的7维度打分模型,你的笔记正在被谁读?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM隐私数据安全 NotebookLM 是 Google 推出的基于用户上传文档构建个性化 AI 助手的工具&#xff0c;其核心优势在于“本地文档理解”&#xff0c;但所有文档均需上传至 Google 云端处理。这意…...

Defender Control:Windows Defender 终极控制指南 - 如何永久禁用Windows安全防护

Defender Control&#xff1a;Windows Defender 终极控制指南 - 如何永久禁用Windows安全防护 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://gitcode.com/gh_mirrors/…...

Fast-GitHub:三步安装解决国内GitHub访问难题的终极指南

Fast-GitHub&#xff1a;三步安装解决国内GitHub访问难题的终极指南 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 你是否经常因为…...

从SD卡初始化到读写文件:一个完整嵌入式项目中的SDIO驱动避坑实践

从SD卡初始化到读写文件&#xff1a;嵌入式SDIO驱动实战全解析 在嵌入式系统开发中&#xff0c;SD卡因其高容量、低成本和便携性成为数据存储的首选方案。然而&#xff0c;看似简单的SD卡接口背后隐藏着复杂的初始化协议和时序要求。许多工程师在项目初期都会遇到SD卡无法识别、…...

【优化交叉口的绿灯时间】基于遗传算法的交通灯管理研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Nestia:基于TypeScript编译时分析的NestJS端到端类型安全实践

1. 项目概述&#xff1a;当NestJS遇上TypeScript的极致类型安全如果你正在用NestJS开发后端API&#xff0c;并且对TypeScript的类型安全有近乎偏执的追求&#xff0c;那么你很可能已经听说过&#xff0c;或者正在寻找一个能让你“写一次&#xff0c;安全两次”的工具。我说的“…...

百度网盘直链解析终极指南:如何实现高速下载的完整技术方案

百度网盘直链解析终极指南&#xff1a;如何实现高速下载的完整技术方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 在云存储服务普及的今天&#xff0c;百度网盘作为国内用…...

DownKyi技术架构解析:构建高性能B站视频下载引擎的工程实践

DownKyi技术架构解析&#xff1a;构建高性能B站视频下载引擎的工程实践 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&…...

从开源物理拼图游戏学习Unity 2D物理引擎与游戏架构设计

1. 项目概述与核心价值 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“openclaw-puzzle-game”。光看名字&#xff0c;你可能会觉得这又是一个普通的开源拼图游戏&#xff0c;但点进去仔细研究后&#xff0c;我发现它的设计思路和实现方式&#xff0c;对于想学习游戏开…...

Claude-Code-KnowCraft:轻量级代码知识库构建与智能问答实践

1. 项目概述与核心价值最近在跟几个做AI应用开发的朋友聊天&#xff0c;大家普遍有个痛点&#xff1a;想把Claude这类大语言模型&#xff08;LLM&#xff09;的能力深度集成到自己的代码库分析工具里&#xff0c;但发现现有的方案要么太重&#xff0c;要么太浅。太重的是指那些…...