ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

.Net Core apollo配置中心使用

2020-11-06 13:33:22  阅读:869  来源: 互联网

标签:Core Apollo IP 配置 指定 Net apollo 客户端


  引用nuget包
Install-Package Com.Ctrip.Framework.Apollo.Configuration
  appsettings.json
  "apollo": {
    "AppId": "SampleApp",
    "MetaServer": "http://11.0.10.235:8080",
    "Env": "DEV"
  }

 

AppId 项目ID
MetaServer apollo服务发现的IP端口,注:不是后台管理的端口
Env  
  Program.cs
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
    //已弃用
    //Com.Ctrip.Framework.Apollo.Logging.LogManager.Provider = new ConsoleLoggerProvider(LogLevel.Trace);

    return WebHost.CreateDefaultBuilder(args)
             .ConfigureAppConfiguration((context, config) =>
             {
                 //注入配置
                 //把阿波罗的日志级别调整为最低
                 LogManager.UseConsoleLogging(Com.Ctrip.Framework.Apollo.Logging.LogLevel.Trace);

                 config.AddApollo(config.Build().GetSection("apollo"))
                .AddDefault(Com.Ctrip.Framework.Apollo.Enums.ConfigFileFormat.Properties); //添加默认application Namespace
            })
             .UseKestrel()
             .UseIISIntegration()
             .UseUrls("http://*:9001")
             .UseStartup<Startup>();

}

 

  ValuesController.cs
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    private readonly IConfiguration _configuration;

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

    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        var appName = _configuration["timeout"];
        return new string[] { "value1", "value2", appName };
    }
}

 

  OK, 集成很简单的,直接运行查看结果 果然没那么顺利。 添加日志 LogManager.UseConsoleLogging(Com.Ctrip.Framework.Apollo.Logging.LogLevel.Trace);   可以看到,客户端是从Docker的内部地址去获取数据,这个IP 应该是从Apollo的服务发现工具Eureka获取的IP。 0   查看官方文档分布式部署中有解决方案
分布式部署的时候,apollo-configservice和apollo-adminservice需要把自己的IP和端口注册到Meta Server(apollo-configservice本身)。
Apollo客户端和Portal会从Meta Server获取服务的地址(IP+端口),然后通过服务地址直接访问。
所以如果实际部署的机器有多块网卡(如docker),或者存在某些网卡的IP是Apollo客户端和Portal无法访问的(如网络安全限制),那么我们就需要在apollo-configservice和apollo-adminservice中做相关限制以避免Eureka将这些网卡的IP注册到Meta Server。
具体文档可以参考Ignore Network Interfaces章节。具体而言,就是分别编辑apollo-configservice/src/main/resources/application.yml和apollo-adminservice/src/main/resources/application.yml,然后把需要忽略的网卡加进去。
如下面这个例子就是对于apollo-configservice,把docker0和veth.*的网卡在注册到Eureka时忽略掉。
    spring:
      application:
          name: apollo-configservice
      profiles:
        active: ${apollo_profile}
      cloud:
        inetutils:
          ignoredInterfaces:
            - docker0
            - veth.*
注意,对于application.yml修改时要小心,千万不要把其它信息改错了,如spring.application.name等。
另外一种方式是直接指定要注册的IP,可以修改startup.sh,通过JVM System Property在运行时传入,如-Deureka.instance.ip-address=${指定的IP},或者也可以修改apollo-adminservice或apollo-configservice 的bootstrap.yml文件,加入以下配置
eureka:
  instance:
    ip-address: ${指定的IP}
最后一种方式是直接指定要注册的IP+PORT,可以修改startup.sh,通过JVM System Property在运行时传入,如-Deureka.instance.homePageUrl=http://${指定的IP}:${指定的Port},或者也可以修改apollo-adminservice或apollo-configservice 的bootstrap.yml文件,加入以下配置
eureka:
  instance:
    homePageUrl: http://${指定的IP}:${指定的Port}
    preferIpAddress: false
做完上述修改并重启后,可以查看Eureka页面(http://${config-service-url:port})检查注册上来的IP信息是否正确。
如果Apollo部署在公有云上,本地开发环境无法连接,但又需要做开发测试的话,客户端可以升级到0.11.0版本及以上,然后通过-Dapollo.configService=http://config-service的公网IP:端口来跳过meta service的服务发现

 

  我这里直接选用的第二种方式也就是修改Deureka.instance.ip-address为指定的IP 首先修改Compose文件,将8090端口也暴露出来,然后重新运行compose文件 进入容器 docker exec it ${容器Id} /bin/bash 进入到执行路径,并修改demo.sh,在106行 JAVA_OPTS 后面字符串中加入-Deureka.instance.ip-address=${指定的IP} cd apollo-quick-start vi demo.sh 0 退出容器并重启容器。 重启容器后要等上一段时间,后台管理才可以访问,然后进入后台管理查看具体项目会报错,应该是服务没启动完全,再等一会儿就OK了。 OK,重新运行程序,并在浏览器中访问 https://localhost:9001/api/Values,可以看到已经获取到配置值    
  1. application (应用)
  • 这个很好理解,就是实际使用配置的应用,Apollo客户端在运行时需要知道当前应用是谁,从而可以去获取对应的配置
  • 每个应用都需要有唯一的身份标识 -- appId,我们认为应用身份是跟着代码走的,所以需要在代码中配置,具体信息请参见Java客户端使用指南
  1. environment (环境)
  • 配置对应的环境,Apollo客户端在运行时需要知道当前应用处于哪个环境,从而可以去获取应用的配置
  • 我们认为环境和代码无关,同一份代码部署在不同的环境就应该能够获取到不同环境的配置
  • 所以环境默认是通过读取机器上的配置(server.properties中的env属性)指定的,不过为了开发方便,我们也支持运行时通过System Property等指定,具体信息请参见Java客户端使用指南
  1. cluster (集群)
  • 一个应用下不同实例的分组,比如典型的可以按照数据中心分,把上海机房的应用实例分为一个集群,把北京机房的应用实例分为另一个集群。
  • 对不同的cluster,同一个配置可以有不一样的值,如zookeeper地址。
  • 集群默认是通过读取机器上的配置(server.properties中的idc属性)指定的,不过也支持运行时通过System Property指定,具体信息请参见Java客户端使用指南
  1. namespace (命名空间)
  • 一个应用下不同配置的分组,可以简单地把namespace类比为文件,不同类型的配置存放在不同的文件中,如数据库配置文件,RPC配置文件,应用自身的配置文件等
  • 应用可以直接读取到公共组件的配置namespace,如DAL,RPC等
  • 应用也可以通过继承公共组件的配置namespace来对公共组件的配置做调整,如DAL的初始数据库连接数
 

标签:Core,Apollo,IP,配置,指定,Net,apollo,客户端
来源: https://www.cnblogs.com/xtjatswc/p/13936427.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有