JAVA开发(通过Apollo注入配置信息的几种方式)

news2024/11/25 13:51:44

前言

在springCloud中有一个重要的组件就是配置中心,config:server,用于配置springboot中需要注入的各种配置项。但是现在发现越来越多的企业使用Apollo进行集成。博主在开发中也是使用Apollo进行配置。本文总结Apollo的的使用,集成到springboot,和注入方式等。

 

一、Apollo简介

Apollo是携程框架部门研发的开源配置管理中心,能够集中管理应用在不同环境、不同集群的配置,配置修改后能够实时的推送到应用端,并且有关于权限管理、流程治理等功能。

(一)Apollo支持四个维度管理key-value格式的配置

  • application(应用级别的,针对于当前应用)
  • environment(环境级别的,在不同环境下可以有不同的配置。比如dev、prod环境)
  • cluster(集群。可以根据集群分为不同的配置)
  • namespace(命名空间。不同的配置文件,比如db的配置,rpc的配置等等) 

(二)Apollo的特性

  • 可以统一去管理不同环境、不同集群的配置。
    (1)同一份代码部署在不同的集群,可以有不同的配置。
    (2)可以通过配置namespace去让不同的应用共享同一份配置(public公共配置),也可以通过关联公共的namespace,并且根据自己的需求对公共配置进行覆盖。(相当于子类可以继承父类,对于父类中的成员,不满足需要的可以自己进行覆盖。)
  • 支持热发布。在管理界面修改完配置后,客户端可以实时的接收到。(据它的描述,时间为1s)
  • 每一次改动配置进行发布,都会有对应的版本的概念,方便后续进行回滚。
  • 灰度发布。(是指改动配置点击发布,只针对部分实例生效。待观察之后,没有问题,再推送到所有实例。)
  • 权限管理(可以针对不同的操作,分配以不同的权限。并且在配置的改动发布上,分为编辑和发布两个独立的操作。)
  • 支持Java和.Net客户端。
  • 提供开放平台API。
  • 部署简单方便(目前唯一的外部依赖是MySQL,因此安装好JDK和MySQL就可以运行。)

二、Apollo的架构与工作原理

(一)Apollo的核心概念

  • application(应用):实际使用配置的应用。
  • environment(环境):配置所对应的环境。比如dev、prd等环境,在不同的环境中可以有不同的配置。默认是读取机器上的配置(server.properties中的env属性)
  • cluster(集群):一个应用下不同实例的分组。比如将北京机房的应用实例分为一个集群,燕郊机房的应用实例分为另一个集群。同一个配置在不同的集群下可以有不同的值。默认是读取机器上(server.properties中的idc属性)
  • namespace(命名空间):一个应用下不同配置的分组,可以理解为配置文件。比如数据库配置文件,rpc配置文件,以及应用自身的配置文件。

(二)Apollo客户端的实现原理

  • 客户端和服务端通过http long polling保持了一个长连接,从而能第一时间获取配置更新的推送。
  • 客户端会定时从Apollo配置中心服务端拉取应用的最新配置
  • 客户端获取到最新的配置后,会保存在内存中。
  • 客户端会将获取到的配置缓存一份在本地(为了保证服务不可用时,从本地恢复)
  • 应用程序可以通过客户端取获取最新的配置。
  • 注:想深入了解的可以去研究下源码,在github上同时也给出了Apollo的源码分析链接)

 三、Apollo的安装(这里介绍通过docker进行安装)

1、 准备工作

Apllo的部署需要Mysql数据库,需要5.6.5以上版本。

2、 创建数据库

Apollo服务端共需要两个数据库:ApolloPortalDB和ApolloConfigDB,我们把数据库、表的创建和样例数据都分别准备了sql文件,只需要导入数据库即可。

执行两个sql文件(通过携程Apollo社区下载)

sql/apolloportaldb.sql

sql/apolloconfigdb.sql

会创建两个数据库

sql文件可在官网:Quick Start · apolloconfig/apollo Wiki · GitHub 下载

 3、服务器上创建shell脚本文件

在/home/docker/script路径下创建“apollo”文件夹

 在/home/docker/script/apollo路径下创建“apollo-portal.sh”脚本文件,内容为:

docker run -d \
--name apollo-portal \
--net=host \
-v /tmp/logs:/opt/logs \
-e SPRING_DATASOURCE_URL=
"jdbc:mysql://数据库地址/apollo_portal?characterEncoding=utf8" \
-e SPRING_DATASOURCE_USERNAME=数据库账号\
-e SPRING_DATASOURCE_PASSWORD=数据库密码\
-e APOLLO_PORTAL_ENVS=test \
-e TEST_META=http://服务器ip地址:8080 \
apolloconfig/apollo-portal

在/home/docker/script/apollo路径下创建“apollo-config.sh”脚本文件,内容为:

docker run -d \
--name apollo-configservice \
--net=host \
-v /tmp/logs:/opt/logs \
-e SPRING_DATASOURCE_URL=
"jdbc:mysql://数据库地址/apollo_config?characterEncoding=utf8" \
-e SPRING_DATASOURCE_USERNAME=数据库账号\
-e SPRING_DATASOURCE_PASSWORD=数据库密码\
apolloconfig/apollo-configservice

在/home/docker/script/apollo路径下创建“apollo-admin.sh”脚本文件,内容为:

docker run -d \
--name apollo-adminservice \
--net=host \
-v /tmp/logs:/opt/logs \
-e SPRING_DATASOURCE_URL=
"jdbc:mysql://数据库地址/apollo_config?characterEncoding=utf8" \
-e SPRING_DATASOURCE_USERNAME=数据库账号\
-e SPRING_DATASOURCE_PASSWORD=数据库密码\
apolloconfig/apollo-adminservice

4、通过docker拉取Apollo镜像

docker pull apolloconfig/apollo-configservice:latest
docker pull apolloconfig/apollo-adminservice:latest
docker pull apolloconfig/apollo-portal:latest

5、运行Apollo

1. ./apollo-portal.sh
2. ./apollo-config.sh
3. ./apollo-admin.sh

6.访问Apollo

 

访问服务器IP:8070可以进行访问,默认的用户名是apollo,密码是admin。

四、Apollo集成到springboot

1、引入maven

		<!-- apollo -->
		<dependency>
			<groupId>com.ctrip.framework.apollo</groupId>
			<artifactId>apollo-client</artifactId>
			<version>${apollo.version}</version>
		</dependency>

		<dependency>
			<groupId>com.ctrip.framework.apollo</groupId>
			<artifactId>apollo-core</artifactId>
			<version>${apollo.version}</version>
		</dependency>

2.启动类注解@EnableApolloConfig

在Apollo系统配置完成配置后

注入方式一:

例子:

	/**
	 * 微信主体appId
	 */
	@Value("${weixin.appid:-1}")
	private String appid;

注入方式二:

使用注解@ConfigurationProperties 使用实体的方式,个人觉得这种方式更好。

例子:

Apollo中配置的格式和yml的格式一致

oss:
  tencent:
    domain:
    region: mhyr-api
    bucketName: mhyr-13015545476
    secretId:  
    secretKey: 
    styleRule:
    thumbnailStyleRule: "!Photo_Compression"
    fileTypes: ## 允许上传的文件类型
        - png
        - jpg
        - jpeg
        - gif
        - bmp
        - svg

代码通过实体类类进行映射 

@ConfigurationProperties(prefix = "oss.tencent")
public class TencentProperties {
	
    /**域名*/
    private String domain;
    /**地域节点*/
    private String region;
    /**存储桶名称*/
    private String bucketName;
    /**secretId*/
    private String secretId;
    /**secretKey*/
    private String secretKey;
    /**图片策略*/
    private String styleRule;
    /**缩略图策略*/
    private String thumbnailStyleRule;
    /**文件类型*/
    private List<String> fileTypes;
}

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

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

相关文章

大模型入门(四)—— 基于peft 微调 LLaMa模型

llama-7b模型大小大约27G&#xff0c;本文在单张/两张 16G V100上基于hugging face的peft库实现了llama-7b的微调。 1、模型和数据准备 使用的大模型&#xff1a;https://huggingface.co/decapoda-research/llama-7b-hf&#xff0c;已经是float16的模型。 微调数据集&#x…

ASEMI代理光宝光耦LTV-0314的应用与优势

编辑-Z 在电子设备的设计和制造过程中&#xff0c;光耦合器是一种至关重要的组件。它们在电路中起到隔离作用&#xff0c;保护电子设备免受电压冲击和电流过载的影响。今天&#xff0c;我们将深入探讨一种特殊的光耦合器——LTV-0314&#xff0c;它的特性、应用以及优势。 一、…

细说如何封装一个日历组件(多视图、可选择、国际化)

前言 最近好奇日历组件是怎么实现的。于是阅读了下react-calendar的源码&#xff0c;并实现了简化版的日历组件。本文把实现日历的设计思路分享给大家。只要理清了主要逻辑&#xff0c;就不难实现了。 技术栈&#xff1a;react、typescript 预览 在线预览demo&#xff1a;c…

亚马逊云科技中国峰会:探索强化学习的未来与Amazon DeepRacer赛车比赛

目录 一、如何构建自己的第一个强化学习模型第一步: 创建 AWS DeepRacer 资源第二步: 定义你的赛道第三步: 训练你的模型第四步: 优化你的模型第五步: 在仿真器中测试你的模型第六步: 在真实赛道上测试你的模型 二、Amazon DeepRacer 中国峰会总决赛三、Amazon DeepRacer 自动驾…

Redis基础+使用+八股文!万字详解一篇就够!

一、目标 学习Redis基础必须掌握的内容&#xff1a; 了解 Redis 以及缓存的作用&#xff1b;掌握 Redis 5 大基本数据类型的使用&#xff1b;掌握常见Redis 面试题&#xff1b;掌握 Redis 的持久化功能&#xff1b;了解 Redis 集群功能。 二、什么是缓存&#xff1f; 缓存定义…

Netty中PileLine类介绍

一、Netty基本介绍 Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具&#xff0c;用以快速开发高性能、高可靠性的网络服务器和客户端程序。Netty 在保证易于开发的同时还保证了其应用的性能&#xff0c;稳定性和伸缩性。 Netty 是一…

VTK Filter 总结

源对象 成像滤波器 可视化滤波器 可视化滤波器&#xff08;输入类型vtkDataSet&#xff09;。 可视化滤波器&#xff08;输入类型vtkPointSet) 可视化滤波器&#xff08;输入类型vtkPolyData) 可视化滤波器&#xff08;(输入类型vtkStructuredGrid)。 可视化滤波器&#xff08;…

浅析视频监控技术及AI发展趋势下的智能化视频技术应用

视频监控技术是指通过摄像机对指定区域进行实时视频直播、录制、传输、存储、管理和分析的技术系统。它可以用于监控各种场所&#xff0c;如校园、工厂、工地、工作场所、公共区域、交通工具等。视频监控技术主要涉及到以下几个部分&#xff1a; 1、摄像机 摄像机是视频监控技…

三年软件测试外包的我也没能转正

外包的群体庞大&#xff0c;很多企业为了节约高昂的人力成本&#xff0c;会把一些非核心业务承包给外包公司&#xff0c;这些工作往往是阶段性、辅助性&#xff0c;没有什么技术含量&#xff0c;而且由于外包人员不是与大厂签订劳动合同&#xff0c;因此&#xff0c;他们更像是…

图像点运算之灰度变换之非线性变换

目录 note code test note 图像点运算之灰度变换之非线性变换 例如&#xff1a;y 10 * x ^ 0.5 code void noline_convert_fun(uchar& in, uchar& out) {out 10 * (uchar)pow((float)in, 0.5); } void img_nonline_convert(Mat& src, Mat& res) {if (s…

html好看的登录界面2(十四种风格登录源码)

文章目录 1.登录风格效果说明1.1 凹显风登录界面1.2 大气简洁风登录界面1.3 弹出背景风登录界面1.4 动态左右切换风登陆界面1.5 简洁背景切换登录界面1.6 可关闭登录界面1.7 蒙蒙山雨风登录界面1.8 苹果弹框风登录界面1.9 上中下青春风登录界面1.10 夏日风登录界面1.11 星光熠熠…

【从零开始玩量化20】BigQuant平台策略代码本地化(与Github同步)

引言 最近发现了个不错的量化平台&#xff0c;BigQuant BigQuant的客服找到我&#xff0c;推荐他们平台给我使用&#xff0c;宣传的是人工智能&#xff0c;里面可以使用类似ChatGPT的聊天机器人&#xff0c;和可视化拖拉拽功能实现策略。 不过&#xff0c;这些都是锦上添花的…

单体 V/s 分布式架构

这是软件架构模式博客系列第 2 章,我们将讨论单体 V/s 分布式架构。 在软件领域,存在多种架构风格可供选择,我们需要关注不同架构风格带来的风险。选择符合业务需求的架构风格是一个长期迭代的过程。 架构风格可以分为两大主要类型:单体架构(将所有代码部署在一个单元中…

Rancher:外部服务连接K8S-MongoDB服务

Rancher&#xff1a;外部服务请求K8S-MongoDB服务 一、前置条件二、「Layer 4 」与「Layer 7」Load Balancing的区别三、部署容器化MongoDB四、Load Banlancer of Service五、mongoDB验证连接六、总结 #参考链接 [1] How access MongoDB in Kubernetes from outside the clust…

树莓派4B多串口配置

0. 实验准备以及原理 0.1 实验准备 安装树莓派官方系统的树莓派 4B&#xff0c;有 python 环境&#xff0c;安装了 serial 库 杜邦线若干 屏幕或者可以使用 VNC 进入到树莓派的图形界面 0.2 原理 树莓派 4B 有 UART0&#xff08;PL011&#xff09;、UART1&#xff08;mini …

腾讯安全周斌:用模型对抗,构建新一代业务风控免疫力

6月13日&#xff0c;腾讯安全联合IDC发布“数字安全免疫力”模型框架&#xff0c;主张将守护企业数据和数字业务两大资产作为企业安全建设的核心目标。腾讯安全副总裁周斌出席研讨论坛并发表主题演讲&#xff0c;他表示&#xff0c;在新技术的趋势影响下&#xff0c;黑灰产的攻…

TS系列之any与unknown详解,示例

文章目录 前言一、一个示例二、示例目的1、功能描述2、主要区别3、代码实现 总结 前言 本片文章主要是在写ts时遇到不知道类型&#xff0c;很容易就想到用any可以解决一切&#xff0c;但这样写并不好。所以今天就总结学习一下&#xff0c;比较好的处理任意类型的unknown。 一、…

patroni+etcd+antdb高可用

patronietcdantdb高可用架构图 Patroni组件功能 自动创建并管理主备流复制集群&#xff0c;并且通过api接口往dcs(Distributed Configuration Store&#xff0c;通常指etcd、zookeeper、consul等基于Raft协议的键值存储)读取以及更新键值来维护集群的状态。键值包括集群状态、…

MySQL ibdata1 文件“减肥”记

夏天来了&#xff0c;没想到连 ibdata1 文件也要开始“减肥”了~ 作者&#xff1a;杨彩琳 爱可生华东交付部 DBA&#xff0c;主要负责 MySQL 日常问题处理及 DMP 产品支持。爱好跳舞&#xff0c;追剧。 本文来源&#xff1a;原创投稿 有句话是这么说的&#xff1a;“在 InnoDB…

深入分析 Java IO (一)概述

目录 一、前言 二、基于字节操作的接口 2.1、字节输入流 2.2、字节输出流 三、基于字符操作的接口 3.1、字符输入流 3.2、字符输出流 四、字节与字符的转化 4.1、输入流转化过程 4.2、输出流转化过程 五、基于磁盘操作的接口 六、基于网络操作的接口 6.1、Socket简…