ASP.NET Core微服务之基于Apollo实现统一配置中心

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
云原生网关 MSE Higress,422元/月
简介: Tip: 此篇已加入.NET Core微服务基础系列文章索引一、关于统一配置中心与Apollo  在微服务架构环境中,项目中配置文件比较繁杂,而且不同环境的不同配置修改相对频繁,每次发布都需要对应修改配置,如果配置出现错误,需要重新打包发布,时间成本较高,因此需要做统一的配置中心,能做到自动更新配置文件信息,解决以上问题。

Tip: 此篇已加入.NET Core微服务基础系列文章索引

一、关于统一配置中心与Apollo

  在微服务架构环境中,项目中配置文件比较繁杂,而且不同环境的不同配置修改相对频繁,每次发布都需要对应修改配置,如果配置出现错误,需要重新打包发布,时间成本较高,因此需要做统一的配置中心,能做到自动更新配置文件信息,解决以上问题。

  Apollo(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。其服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。

Apollo目前在国内开发者社区比较热,在Github上有超过5k颗星,在国内众多互联网公司有落地案例,可以说Apollo是目前配置中心产品领域No.1的产品,其成熟度和企业级特性要远远强于Spring Cloud体系中的Spring Cloud Config产品

  目前有针对Java和.Net的两个客户端供使用:

  Java客户端不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有额外支持。

  .Net客户端不依赖任何框架,能够运行于所有.Net运行时环境。

  更多Apollo介绍请浏览 Apollo配置中心介绍

二、Apollo的快速安装与基本配置

2.1 快速安装

  Apollo GitHub中提供了一个让我们快速上手的Quick Start,帮助我们快速在本地环境部署,启动Apollo配置中心。这里主要集中于针对开发环境的本地部署(单击),要部署到生产环境,请参考 Apollo分布式部署指南

  这里我使用的是Windows Server的虚拟机在本机搭的,当然你可以在你的Linux虚拟机中搭建,另外你也可以通过Docker更快捷地部署Apollo

  Step1.准备下列软件/环境

Java => JDK 1.8+
MySQL => 5.6.6+
Gitbash
Apollo QuickStart

  Step2.陆续安装Java JDK, MySQL与Git

  Step3.导入脚本(从QuickStart目录中的sql文件夹中拷贝),导入的结果会创建两个数据库:

  Step4.修改demo.sh中关于数据库连接的信息,主要是url、username与password

apollo config db info

apollo_config_db_url=jdbc:mysql://192.168.80.70:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=root
apollo_config_db_password=213224591

apollo portal db info

apollo_portal_db_url=jdbc:mysql://192.168.80.70:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=root
apollo_portal_db_password=213224591

  Step5.通过以下命令启动(切换到quickstart的目录中),后续可以将其作为Windows服务,不过生产环境一般用Linux。

cmd>cd C:Apolloapollo-build-scripts-master
cmd>demo.sh start  

  启动后会最终显示以下信息:

==== starting service ==== Service logging file is ./service/apollo-service.log Started [3099] Waiting for config service startup....... Config service started. You may visit http://localhost:8080 for service status now! Waiting for admin service startup.... Admin service started ==== starting portal ==== Portal logging file is ./portal/apollo-portal.log Started [4071] Waiting for portal startup...... Portal started. You can visit http://localhost:8070 now!

  看到上述信息显示完毕,证明我们的Apollo已经成功启动起来了,那么我们可以去这两个端口8080和8070去看看:

  [8070 => Apollo 配置中心管理界面,默认账号:apollo/admin]

  进入之后会看到一个示例项目SampleApp,点进去可以看到其中有一个示例配置applicaiton

  8080 => Eureka服务注册&发现,和Consul类似,因为Apollo采用了Eureka作为服务注册中心,对Apollo架构感兴趣的童鞋可以阅读波波老师的《[携程配置中心Apollo架构分析》,这里不是本文的重点]

2.2 基本配置

  Step1.创建一个新项目(这里部门可以自己在数据中编辑serverconfig表添加)

  Step2.默认情况下,创建新项目后有一个默认的application的Namespace,我们删除它,然后重新创建我们要用到的配置。对于一般共用的数据库、Redis、RabbitMQ等配置,我们一般会将其放到一个Public的配置列表中,而每个项目中私有的配置信息(如Swagger文档的说明信息)我们会单独创建一个Private的配置列表给每个项目。

  下图为创建一个共享的配置列表(在Apollo中称为Namespace,详细内容可以参考:Apollo核心概念之Namespace

  Step3.向Shared和ClientService两个Namespace中添加Key/Value配置项(可以通过文本形式添加,速度更快),添加之后记得点击发布,最终结果如下图所示:

  现在配置都有了,开始和我们的ASP.Net Core集成把。

三、ASP.NET Core中集成Apollo

3.1 准备工作

  导入.Net Core的客户端package,看这个名字Com.Ctrip.Framework.Apollo.Configuration应该是Java程序员写的,特别的Java Style.

PM>Install-Package Com.Ctrip.Framework.Apollo.Configuration 

  修改appsettings.json,添加apollo节点:指明apollo的AppId和Server地址 => AppId 用来标识应用身份的唯一id,Apollo客户端针对不同的环境会从不同的服务器获取配置 ,MetaServer 就是客户端获取配置的服务器配置

  "apollo": {
    "AppId": "MSAD",
    "MetaServer": "http://192.168.80.70:8080"
  }

3.2 更改Program.cs

  这里主要会在启动时读取appsettings.json中的AppId和MetaServer来连接Apollo,并且指定要读取哪个Namespace的配置项

    public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((hostingContext, builder) =>
                {
                    builder
                    .AddApollo(builder.Build().GetSection("apollo"))
                    .AddDefault()
                    .AddNamespace("TEST3.Shared");
                    .AddNamespace("ClientService");
                })
                .UseStartup<Startup>()
                .Build();

3.3 更改StartUp.cs

  对于StartUp.cs,它承担了很多初始化的注入工作,我们会在里边引入很多配置项,但是幸运的是我们不需要做太多更改,只是把配置项的Key换成Apollo中定义的即可。例如:

    // IoC - DbContext
    services.AddDbContextPool<ClientDbContext>(
                options => options.UseSqlServer(Configuration["DB"]));

    // Swagger
    services.AddSwaggerGen(s =>
    {
        s.SwaggerDoc(Configuration["Swagger.DocName"], new Info
        {
            Title = Configuration["Swagger.Title"],
            Version = Configuration["Swagger.Version"],
            Description = Configuration["Swagger.Description"],
            Contact = new Contact
            {
                Name = Configuration["Swagger.Contact:Name"],
                Email = Configuration["Swagger.Contact:Email"]
            }
        });
        ......
    });

  这里通过查看Swagger API文档来验证一下是否读出来了配置项Value:

  更多内容,请参考Apollo的.Net core客户端分支:https://github.com/ctripcorp/apollo.net/tree/dotnet-core

  这时如果我们在Apollo中更改了ClientService的Swagger.Title配置项并发布之后(因为我们的Swagger在启动时注入的,所以无法获取实时更新的值),重启一下ClientService,配置已经更改为下图所示:

对于需要实时获取更新的item,我们也可以做一个测试,比如在一个Controller中获取:

    [Route("api/Values")]
    public class ValuesController : Controller
    {
        private IConfiguration _configuration;

        public ValuesController(IConfiguration configuration)
        {
            _configuration = configuration;
        }

        [HttpGet]
        public IActionResult Get()
        {
            string title = _configuration.GetValue<string>("Service_Swagger_Title");

            return Json(title);
        }
    }

  第一次获取Title为:

  修改Title为:CAS Premium Service API v4

  刷新浏览器,已经实时更新:

四、小结

  本篇简单介绍了一下统一配置中心与Apollo的基本概念,然后介绍了Apollo的快速安装(基于QuickStart)与基本配置,最后通过与ASP.NET Core的集成演示了如何在项目中使用Apollo替代原有的配置文件(appsettings.json)。当然,本篇只是一个QuickStart,更多的内容都没有覆盖,需要我们去看官方Wiki了解。Apollo目前在国内开发者社区比较热,在Github上有超过5k颗星,在国内众多互联网公司有落地案例,值得我们学习和了解

参考资料

(1)min.jiang,《统一配置中心

(2)张乐,《开源配置中心之Apollo

(3)陈珙,《基于Windows Server部署Apollo初次体验

(4)Apollo Quick Start: https://github.com/ctripcorp/apollo/wiki/Quick-Start

(5)Apollo GitHub: https://github.com/ctripcorp/apollo

(6)杨波,《携程配置中心Apollo架构分析

(7)focus-lei,《.Net core使用Apollo做统一配置中心

(8)张善友,《携程Apollo(阿波罗)配置中心在.NET Core项目快速集成

(9)ctrip,《Apollo .Net客户端使用指南

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
7月前
|
缓存 Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
本文介绍了在Spring Boot中配置Swagger2的方法。通过创建一个配置类,添加`@Configuration`和`@EnableSwagger2`注解,使用Docket对象定义API文档的详细信息,包括标题、描述、版本和包路径等。配置完成后,访问`localhost:8080/swagger-ui.html`即可查看接口文档。文中还提示了可能因浏览器缓存导致的问题及解决方法。
741 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
|
7月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
936 0
|
7月前
|
Java 测试技术 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
101 0
|
7月前
|
SQL Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
635 0
|
7月前
|
Java 数据库连接 微服务
微服务——MyBatis配置——事务管理
本段内容主要介绍了事务管理的两种类型:JDBC 和 MANAGED。JDBC 类型直接利用数据源连接管理事务,依赖提交和回滚机制;而 MANAGED 类型则由容器全程管理事务生命周期,例如 JEE 应用服务器上下文,默认会关闭连接,但可根据需要设置 `closeConnection` 属性为 false 阻止关闭行为。此外,提到在使用 Spring + MyBatis 时,无需额外配置事务管理器,因为 Spring 模块自带的功能可覆盖上述配置,且这两种事务管理器类型均无需设置属性。
99 0
|
7月前
|
Java 数据库连接 数据库
微服务——MyBatis配置——多环境配置
在 MyBatis 中,多环境配置允许为不同数据库创建多个 SqlSessionFactory。通过传递环境参数给 SqlSessionFactoryBuilder,可指定使用哪种环境;若忽略,则加载默认环境。`environments` 元素定义环境配置,包括默认环境 ID、事务管理器和数据源类型等。每个环境需唯一标识,确保默认环境匹配其中之一。代码示例展示了如何构建工厂及配置 XML 结构。
105 0
|
7月前
|
Java 数据库连接 数据库
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——MyBatis 介绍和配置
本文介绍了Spring Boot集成MyBatis的方法,重点讲解基于注解的方式。首先简述MyBatis作为持久层框架的特点,接着说明集成时的依赖导入,包括`mybatis-spring-boot-starter`和MySQL连接器。随后详细展示了`properties.yml`配置文件的内容,涵盖数据库连接、驼峰命名规范及Mapper文件路径等关键设置,帮助开发者快速上手Spring Boot与MyBatis的整合开发。
877 0
|
7月前
|
缓存 Java 应用服务中间件
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——依赖导入和Thymeleaf相关配置
在Spring Boot中使用Thymeleaf模板,需引入依赖`spring-boot-starter-thymeleaf`,并在HTML页面标签中声明`xmlns:th=&quot;http://www.thymeleaf.org&quot;`。此外,Thymeleaf默认开启页面缓存,开发时建议关闭缓存以实时查看更新效果,配置方式为`spring.thymeleaf.cache: false`。这可避免因缓存导致页面未及时刷新的问题。
281 0
|
7月前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
242 0
|
7月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
在微服务架构中,随着业务复杂度增加,项目可能需要调用多个微服务。为避免使用`@Value`注解逐一引入配置的繁琐,可通过定义配置类(如`MicroServiceUrl`)并结合`@ConfigurationProperties`注解实现批量管理。此方法需在配置文件中设置微服务地址(如订单、用户、购物车服务),并通过`@Component`将配置类纳入Spring容器。最后,在Controller中通过`@Resource`注入配置类即可便捷使用,提升代码可维护性。
105 0