• .Net Core 商城微服务项目系列(十四):分布式部署携程Apollo构建配置中心


    一、开场白

    在系统设计里我们有很多配置希望独立于系统之外,而又能够被系统实时读取。但是在传统的系统设计里,配置信息通常是耦合在系统内的,比如.net里通常会放在App.config或者web.config里,.net core则是appsettings.json里,这些都不够灵活,如果在制度严格,不允许随便登录服务器的中大型公司里,每次的配置更改就意味着系统的发布,毫无疑问,肯定有带哥要吐槽了,什么垃圾架构!为了解决这一问题,Apollo应运而生,专门用来构建微服务架构里的配置中心,在实际生产项目里为了达到高可用,我们会将其以分布式的方式部署。

     粘贴下官方的下载和文档:

    官网:https://github.com/ctripcorp/apollo

    Wiki:https://github.com/ctripcorp/apollo/wiki(一切的集成方式和使用方法都在这里)

    Issues:https://github.com/ctripcorp/apollo/issues(如果期间有任何问题,请通过这里查找大部分解决方法)

    二、Maven编译源码

    首先要说明一下,官方提供的Quick Start以及预先打好的安装包如果不进行特殊配置都只能单机搭建使用,通过所以如果你想把Apollo搭建在公有云或者调用放和部署不在同一环境,最好自己编译项目。

    我这里使用阿里云搭建Apollo,系统是CentOs 7。

    1.首先我们需要在以下地址下载源码:

    https://github.com/ctripcorp/apollo/releases

    2. 源码下载完成后我们需要修改两个地方,Apoolo是微服务架构,使用Eureka实现服务的注册和发现,分布式部署的时候,apollo-configserviceapollo-adminservice需要把自己的IP和端口注册到MetaServer(apollo-configservice本身)Server(apollo-configservice本身)。所以如果实际部署的机器有多块网卡(如docker),或者存在某些网卡的IP是Apollo客户端和Portal无法访问的(如网络安全限制),那么我们就需要在apollo-configserviceapollo-adminservice中做相关限制以避免Eureka将这些网卡的IP注册到Meta Server。

    我这里的解决方式是直接指定IP。通过修改apollo-adminservice或apollo-configservice 的bootstrap.yml文件,指定apollo-configservice和apollo-adminservice的IP端口。

    解压源码文件,通过 apollo-1.3.0apollo-adminservicesrcmain esources 找到 bootstrap.yml 文件,添加以下配置:

    eureka:
      instance:
        ip-address: xx.xx.xx.xx
        hostname: ${hostname:47.99.92.76}
        preferIpAddress: true
        status-page-url-path: /info
        health-check-url-path: /health
      client:
        serviceUrl:
          # This setting will be overridden by eureka.service.url setting from ApolloConfigDB.ServerConfig or System Property
          # see com.ctrip.framework.apollo.biz.eureka.ApolloEurekaClientConfig
          defaultZone: http://${eureka.instance.hostname}:8080/eureka/
        healthcheck:
          enabled: true
        eurekaServiceUrlPollIntervalSeconds: 60
    
    management:
      health:
        status:
          order: DOWN, OUT_OF_SERVICE, UNKNOWN, UP 

    ip-address是我阿里云的公有IP,其它部署环境同理。

    通过 apollo-1.3.0apollo-configservicesrcmain esources 找到 bootstrap.yml 文件,配置同上。

    同时我们还需要配置下MySQL数据库的链接信息,通过 apollo-1.3.0scripts 找到 build.sh 文件,编辑链接信息:

    # apollo config db info
    apollo_config_db_url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8
    apollo_config_db_username=xxx
    apollo_config_db_password=xxx
    
    # apollo portal db info
    apollo_portal_db_url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8
    apollo_portal_db_username=xxx
    apollo_portal_db_password=xxx

    因为我的MySQL就是部署在同一个阿里云上,所以就使用localhost,大家酌情修改。

    Apollo依赖于MySQL,我们需要先把其对应的数据库跑出来,通过以下路径加载两个sql文件:

    Configdb:apollo-1.3.0scriptsdbmigrationconfigdb

    Portaldb:apollo-1.3.0scriptsdbmigrationportaldb

    配置就到这里,接下来我们要安装Maven环境来编译源码:

    1.安装maven

    wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz

    Windows环境通过本文安装:https://blog.csdn.net/Snowprincev/article/details/81670037

    2、解压安装

    tar -zxvf apache-maven-3.3.9-bin.tar.gz 

    mv apache-maven-3.3.9 /usr/local/maven-3.3.9

    3、配置环境变量

    vi /etc/profile

    #在适当的位置添加

    export M2_HOME=/usr/local/maven3  (这里需要制定你的安装目录 自定义的哈)

    export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin

    4、使配置生效

    保存退出后运行下面的命令使配置生效,或者重启服务器生效。

    source /etc/profile

    5、验证版本

    mvn -v

    6.配置阿里云仓库,国内速度快

    在maven的settings.xml 文件里配置mirrors的子节点,添加如下mirror:

    <mirror>
            <id>nexus-aliyun</id>
            <mirrorOf>*</mirrorOf>
            <name>Nexus aliyun</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror> 

    7.阿里云cd到源码文件夹路径 apollo-1.3.0scripts ,执行以下命令编译源码:

    ./build.sh

    该脚本会依次打包apollo-configservice, apollo-adminservice, apollo-portal。

    8.编译完成后

    获取位于apollo-configservice/target/目录下的apollo-configservice-x.x.x-github.zip。解压后执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh.

    获取位于apollo-adminservice/target/目录下的apollo-adminservice-x.x.x-github.zip。解压后执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh.

    获取位于apollo-portal/target/目录下的apollo-portal-x.x.x-github.zip。解压后执行scripts/startup.sh即可。如需停止服务,执行scripts/shutdown.sh.

    OK,上面3个启动后,我们就可以通过Ip:8070 访问Apollo的UI界面的,通过默认的 账户密码登录:apollo/admin

    通过IP:8080访问Eureka的UI界面查看被注册的configure和admin两个进程。

     

    二、新建.Net Core API项目试用

    1.新建.net core api项目,通过nuget引入项目包:Com.Ctrip.Framework.Apollo.Configuration。

    2.在Program.cs中添加如下代码:

        public class Program
        {
            public static void Main(string[] args)
            {
                CreateWebHostBuilder(args).Build().Run();
            }
    
            public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((hostingContext, builder) =>
                {
                    builder
                    .AddApollo(builder.Build().GetSection("apollo"))
                    .AddDefault();
                })
                    .UseStartup<Startup>();
        }

    3.appsettings.json中进行如下配置,我们这里试用默认自带的SimpleApp测试:

    {
      "apollo": {
        "AppId": "SampleApp",
        "MetaServer": "http://47.99.92.76:8080",
        "Env": "Dev"
      }
    }

    这里配置的意思是客户端需要通过Eureka查询Configure服务的地址,从而获取配置信息。

      private IConfiguration _configuration;
    
            public ValuesController(IConfiguration configuration)
            {
                _configuration = configuration;
            }
    
            [HttpGet]
            public ActionResult<IEnumerable<string>> Get()
            {
                string title = _configuration["timeout"];
                return new string[] { "value1", "value2", title };
            }

    运行项目查看:

    OK,运行成功,更多信息大家可以去官方gitHub查看哦,目前博主所在的公司已经使用Apollo很久了,而且.net 端一个分支的维护者还是博主公司架构组的一位同事,就是下面这个:

    看下使用Apollo后的项目运行图,服务配置数据可以正常请求:

    今天就到这了,12点睡觉了!!

  • 相关阅读:
    Day 83 VUE——组件、插槽、生命周期
    Power BI制作GDP动态排行榜
    SQL中为什么经常要加WITH(NOLOCK)
    ant-desin-vue——table全选时自定义的禁用行也被选上,且最后一行不选中问题
    ant-design-vue——a-select下拉框值为空字串时,高度偏窄问题
    ant-desgin-vue——tree自定义节点不可选用的置灰或禁用
    js——在A页面打开新页面B,关闭新页面B后刷新A页面
    Vue You may have an infinite update loop in a component render function.
    js实现继承的方法中为何总是要修正constructor方法的指向呢?
    Spring boot 扫描不到 mybatis 接口包
  • 原文地址:https://www.cnblogs.com/weiBlog/p/10771969.html
Copyright © 2020-2023  润新知