精华内容
下载资源
问答
  • 配置中心Apollo多环境部署

    千次阅读 2018-12-12 15:42:37
    配置中心Apollo多环境部署关于ApolloApollo 与 Springcloud configApollo的部署多环境部署源码编译方式传统部署(多环境)下载项目源码执行数据库sql修改build 配置文件,编译项目启动服务springboot 客户端demo ...

    关于Apollo

    Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

    github地址:https://github.com/ctripcorp/apollo
    在官方的wiki 里,有很多资料,包括部署 客户端应用等
    github wiki 地址:https://github.com/ctripcorp/apollo/wiki

    Apollo 与 Springcloud config

    Apollo 是携程框架研发部门研发的一款基于springboot和springcloud 写的一个配置中心项目,使用长连接实现配置下发,现在已经开源,可以秒级感应热部署配置文件。

    Springcloud Config 是springcloud 全家桶里的一员,基于git 做的配置中心,对于热部署配置文件来说,还需要配合 git 的webhook 触发 springcloud bus,达到配置下发,从实现机制来说,Apollo 是要快上许多。而完全依赖于git 的config 不仅配置麻烦,而且感觉会很low。

    先说一下我的使用感受,部门里一个微服务支付的项目用的就是springcloud config 配置中心

    优点:

    1. 基于git(当然svn,jdbc,本地缓存也支持),对于github 或者 gitlab 来讲比较熟悉,git的优点可以应用于配置文件上
    2. 配置文件管理一幕了然,公有的配置文件或者项目私有的配置,按照规范填写,分类后比较好找,按照项目,按照模块建包,一目了然
    3. … (我是个不善于总结优点的人)

    来说说缺点:

    1. 如果要实现热部署配置文件,需要配合springcloud bus,在github上做webhook ,依赖性很强,配置复杂,实时性也一般,不做热加载的配置下发,那配置中心将毫无意义。
    2. 配置复杂意味着,且对代码有侵入,学习成本高,个人不是很喜欢。
    3. 配置文件命名规则,很麻烦,配置都在命名上,根据命名搜索,没有可视化的配置
    4. 权限控制,配置下发基于git的权限,也是成也git 败也git ,不能很好掌控配置下发的权利
    5. 不支持多语言客户端,全家桶的问题
    6. …(我还是个不善于总结缺点的人)

    关于Apollo ,使用感受非常爽,先吹他一个彩虹屁。
    优点

    • 无需过多的依赖,原生java,.net 都很好应用,多语言客户端无需过多的依赖,原生java,springboot,.net 都很好应用,多语言客户端
    • 依赖少,不基于git,部署简单,即能实现动态加载配置,客户端配置也简单
    • 可视化操作,权限控制,都让人很爽
    • 多环境支持,可以 dev fat uat pro,提供分布式部署

    缺点

    • 可能还是使用太少,项目一多,文件数量一多,文件关系一复杂,配置起来比较头晕目眩,查找项目也比较难找
    • 本来以为上面这个是缺点,但是写着写着想到了还是好管理的,否认了我自己,写文章的时候没有参考很多,只是把自己想到的记录下,以后会补充,有很多不正确的地方,也需要读者多多指教。保持着尽量严谨和实践证实的心态写文章。

    Apollo的部署

    多环境部署

    首先是使用多环境部署,关于Apollo 的环境,支持dev,fat,uat,pro 四种部署环境。

    Apollo 包括 服务端,页面前端 与 自己的客户

    每一个环境就是一个服务端,前端页面portal 可以集成多个环境,多环境就是比单环境多增加了几个服务端罢了。

    如果只想建单环境,起一个服务端即可。

    例如
    单环境:
    在192.16.35.11 上部署dev 的服务端(Apollo-adminserver + Apollo-configserver+portal)

    多环境:
    在192.16.35.11 上部署dev 的服务端(Apollo-adminserver + Apollo-configserver)
    在192.16.35.12 上部署pro 的服务端(Apollo-adminserver + Apollo-configserver)

    最后在生产的机器192.16.35.12 上配置 前端页面服务就行 (Apollo-portal)

    源码编译方式传统部署(多环境)

    部署环境:
    maven 3.3.9
    jdk 1.8
    Apollo v0.11.0
    dev 服务器 192.16.35.10 (admin-server 与 config-server)
    pro 服务器 192.16.35.11(admin-server , config-server,portal)

    下载项目源码

    v1.0.0 之后是用springboot 2.0 写的,而我们自己还是1.5.10
    官方文档部署里有声明springboot的某些配置需要v0.10.0 之后
    所以这里选了v0.11.0 版本
    下载地址:https://github.com/ctripcorp/apollo/releases
    自己选择脚本下载tar.gz 的包

    然后上传到linux 服务器上,这里采用的是RedHat7.4,centos同理

    tar xvf apollo-0.11.0.tar.gz
    

    解压到自己的服务器上。
    在这里插入图片描述
    会看到如下项目路径,windows 使用idea 打开也行

    执行数据库sql

    进入scripts 文件夹 里面有个sql 文件,一个是configdb 服务端的sql,一个是portaldb 的sql,每一个服务端需要一个configdb,如果没有多个mysql服务,暂时建在同一个mysql服务下,但是要修改configdb的数据库名字

    以下两处 ApolloConfigDB 改为 ApolloConfigDB2
    在这里插入图片描述
    这样在你的mysql 上应该有一个ApolloConfigDB 一个ApolloConfigDB2 一个ApolloPortalDB 三个数据库

    分别对应dev环境的数据库 pro 环境的数据库 和 portal 的数据库

    修改build 配置文件,编译项目

    在刚刚的sql 同级目录下,有个build.sh 。 windows用bat
    修改

    #!/bin/sh
    
    # apollo config db info
    apollo_config_db_url=jdbc:mysql://your-mysqldb:port/ApolloConfigDB?characterEncoding=utf8
    apollo_config_db_username=root
    apollo_config_db_password=******
    
    # apollo portal db info
    apollo_portal_db_url=jdbc:mysql://your-mysqldb:port/ApolloPortalDB?characterEncoding=utf8
    apollo_portal_db_username=root
    apollo_portal_db_password=******
    
    # meta server url, different environments should have different meta server addresses
    dev_meta=http://dev:8080
    #fat_meta=http://fill-in-fat-meta-server:8080
    #uat_meta=http://fill-in-uat-meta-server:8080
    pro_meta=http://fill-in-pro-meta-server:8080
    
    META_SERVERS_OPTS="-Ddev_meta=$dev_meta "
    
    # =============== Please do not modify the following content =============== #
    
    

    这个就很明白了
    dev 服务器上不启动portal ,不需要修改portal 的信息,只需要修改apollo config db 的数据库连接信息,连接到 apollo config db

    pro 服务器上需要启动portal ,则需要修改portal 的db 信息,注意修改这里apollo config db 的数据库名字已经变成 ApolloConfigDB2了,
    另外 meta server 不建议使用8080 端口,可以改为其他,如7070
    dev_meta ip 用dev环境的 ip
    pro_meta 使用localhost即可
    META_SERVERS_OPTS 使用了哪几个环境就填哪几个

    # meta server url, different environments should have different meta server addresses
    dev_meta=http://192.16.35.10:7070
    #fat_meta=http://fill-in-fat-meta-server:8080
    #uat_meta=http://fill-in-uat-meta-server:8080
    pro_meta=http://localhost:7070
    
    META_SERVERS_OPTS="-Ddev_meta=$dev_meta -Dpro_meta=$pro_meta "
    
    

    最后两台服务器分别执行 ./build.sh 编译源码

    启动服务

    第一次编译需要点时间

    编译完成后,在各个项目下会出现target文件,里面有个zip文件夹
    例如: apollo-adminservice-0.11.0-github.zip
    在这里插入图片描述

    这里只需要关注三个项目,圈圈出来的
    在这里插入图片描述

    在dev服务器下 解压 adminservice 和configservice
    在pro服务器下 解压adminservice 和configservice,portal
    解压到test文件夹下

    unzip apollo-adminservice-0.11.0-github.zip -d test
    

    解压完毕后启动项目,在解压出来的test下有个script文件夹,里面有启动脚本

    ./startup.sh
    

    注意的是 adminservice 直接启动,configservice 刚刚修改了端口7070,需要修改startup.sh 里的端口设置

    SERVER_PORT=7070
    

    portal在启动前修改数据库参数,apollo.portal.envs value 改为 dev,pro 有多个环境的,直接 逗号然后加上去就行,然后启动portal,打开192.16.35.11:8070 (pro服务器:port),登录用户/密码 apollo/admin

    在这里插入图片描述

    springboot 客户端demo (待续)

    Docker or Kubernetes 方式 (待续)

    展开全文
  • spring boot + nacos多环境部署

    千次阅读 2019-09-09 19:54:14
    spring boot + nacos多环境部署 问题描述 nacos 是什么这里就不阐述了,在本篇博客中作用是作为spring boot动态配置的中心,配合spring cloud 可以很容易的实现多环境的部署,但是配合spring boot就出现问题,无法...

    spring boot + nacos多环境部署

    问题描述

    nacos 是什么这里就不阐述了,在本篇博客中作用是作为spring boot动态配置的中心,配合spring cloud 可以很容易的实现多环境的部署,但是配合spring boot就出现问题,无法实现。示例如下

    在这里插入图片描述
    application.properties配置内容如下

    server.port=8088
    spring.profiles.active=local
    nacos.config.server-addr=127.0.0.1:8848
    

    application-local.properties配置内容如下

    nacos.config.group=LOCAL
    

    application-myself.properties配置内容如下

    nacos.config.group=MYSELF
    

    预期效果就是maven根据不同的环境打包,这样很方便,项目整体改动也很小
    刚好nacos有spring boot集成的方案
    github地址

    但是整个项目拉下来之后发现根本不行,会有报错: endpoint not blank,应该是nacos配置中心地址没有配置或者没有找到
    所以没办法那就自己搞

    解决思路

    nacos配置两种方式,一种是硬编码一种是纯配置文件配置,所以有两种解决方式
    一、
    硬编码,也就是在启动类上加注解

    @NacosPropertySource(
            groupId = "MYSELF",
            dataId = "eco-mock",
            autoRefreshed = true,
            type = ConfigType.PROPERTIES
    )
    

    差不多就像这样,像个办法在项目启动前改变这个group的值,或者这个dataId的值(用来区分不同的配置环境)

    二、
    纯配置文件

    #开启配置预加载功能
    nacos.config.bootstrap.enable=true
    
    # 主配置服务器地址
    nacos.config.server-addr=127.0.0.1:8848
    # 主配置 data-id
    nacos.config.data-id=eco-mock
    # 主配置 group-id
    nacos.config.group=MYSELF
    # 主配置 配置文件类型
    nacos.config.type=properties
    # 主配置 最大重试次数
    nacos.config.max-retry=10
    # 主配置 开启自动刷新
    nacos.config.auto-refresh=true
    # 主配置 重试时间
    nacos.config.config-retry-time=2333
    # 主配置 配置监听长轮询超时时间
    nacos.config.config-long-poll-timeout=46000
    # 主配置 开启注册监听器预加载配置服务(除非特殊业务需求,否则不推荐打开该参数)
    nacos.config.enable-remote-sync-config=true
    

    通过某种方式让 nacos.config.group=MYSELF这个数值改变或者让application.properties变成我们指定的环境配置

    三、我们可以利用maven在打包时会将配置文件中的参数赋值的机制,动态修改application.properties文件(推荐)

    准备工作

    nacos 配置中心的具体配置
    dataId:eco-mock
    group:myself

    eco.test.nacos=myself
    eco.enable.sendMsg=false
    

    dataId:eco-mock
    group:local

    eco.test.nacos=local
    eco.enable.sendMsg=false
    

    配置文件如上问题描述

    再注入的代码中输出数据

    @Configuration
    @Slf4j
    public class CommonParam {
        public static String TEST_NACOS;
    
        @NacosValue(value = "${eco.test.nacos}",autoRefreshed = true)
        public void setTestNacos(String testNacos) {
            log.info("修改 eco.test.nacos ==> {}", testNacos);
            this.TEST_NACOS = testNacos;
        }
    }
    
    

    具体实施

    方案一

    首先注解的中的值如果要修改只能在类加载初始化的时候,那就是启动类静态代码块中进行修改

    import com.alibaba.nacos.api.config.ConfigType;
    import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.scheduling.annotation.EnableScheduling;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Proxy;
    import java.util.Map;
    import java.util.Properties;
    @NacosPropertySource(
            groupId = "",
            dataId = "eco-mock",
            autoRefreshed = true,
            type = ConfigType.PROPERTIES
    )
    @EnableScheduling
    @SpringBootApplication
    public class MockApplication {
        
        static {
            try {
                Properties properties = new Properties();
                properties.load(MockApplication.class.getClassLoader().getResourceAsStream("application.properties"));
    			// 从配置文件中读取当前部署的环境
                String profile = properties.getProperty("spring.profiles.active");
    			// 读取指定环境对应的group
                properties.load(MockApplication.class.getClassLoader().getResourceAsStream(String.format("application-%s.properties", profile)));
                String groupId = properties.getProperty("nacos.config.group");
    
    			// 进行赋值
                NacosPropertySource annotation = MockApplication.class.getAnnotation(NacosPropertySource.class);
                InvocationHandler ih = Proxy.getInvocationHandler(annotation);
                Field memberValuesField  = ih.getClass().getDeclaredField("memberValues");
                memberValuesField .setAccessible(true);
                Map map = (Map) memberValuesField .get(ih);
                map.put("groupId", groupId);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        public static void main(String[] args) {
            SpringApplication springApplication = new SpringApplication(MockApplication.class);
    
            springApplication.run(args);
        }
    
    }
    
    

    先修改application.properties配置 spring.profiles.active=local

    在这里插入图片描述
    启动日志如下

    再application.properties配置 spring.profiles.active=myself
    在这里插入图片描述
    说明配置成功
    线上项目只需要修改为spring.profiles.active=@activatedProperties@然后部署根据maven指定环境即可

    方案二

    可以看下这篇博客中的maven方案
    思路相同,因为配置文件预加载加载的是application.properties,
    那么我只需要将指定的配置文件比如说application-local.properties打包成application.properties即可
    具体实施我就不写了,大同小异

    方案三(个人推荐)

    #开启配置预加载功能
    nacos.config.bootstrap.enable=true
    
    # 主配置服务器地址
    nacos.config.server-addr=@addr@
    # 主配置 data-id
    nacos.config.data-id=eco-mock
    # 主配置 group-id
    nacos.config.group=@group@
    # 命名空间指定
    nacos.config.namespace=@space@
    # 主配置 配置文件类型
    nacos.config.type=properties
    # 主配置 最大重试次数
    nacos.config.max-retry=10
    # 主配置 开启自动刷新
    nacos.config.auto-refresh=true
    # 主配置 重试时间
    nacos.config.config-retry-time=2333
    # 主配置 配置监听长轮询超时时间
    nacos.config.config-long-poll-timeout=46000
    # 主配置 开启注册监听器预加载配置服务(除非特殊业务需求,否则不推荐打开该参数)
    nacos.config.enable-remote-sync-config=true
    

    pom.xml 中如下配置

    <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                 <!-- 替换 配置文件中 @ss@ 样式字符-->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <configuration>
                        <encoding>UTF-8</encoding>
                        <delimiters>
                            <delimiter>@</delimiter>
                            <delimiter>${*}</delimiter>
                        </delimiters>
                        <useDefaultDelimiters>false</useDefaultDelimiters>
                    </configuration>
                </plugin>
            </plugins>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                     <!-- 替换开关-->
                    <filtering>true</filtering>
                </resource>
            </resources>
        </build>
     <profiles>
            <profile>
                <!-- 本地开发环境 -->
                <id>local</id>
                <properties>
                    <env>local</env>
                    <addr>192.168.1.198:8848</addr>
                    <space>4ca4defb-a712-408b-8b1a-301774637d79</space>
                </properties>
                <activation>
                    <!-- 设置默认激活这个配置 -->
                    <activeByDefault>true</activeByDefault>
                </activation>
            </profile>
            <profile>
                <!-- 发布环境 -->
                <id>prod</id>
                <properties>
                    <env>prod</env>
                    <addr>192.168.1.122:8848</addr>
                    <space>4ca4defb-a712-408b-8b1a-89878972a</space>
                </properties>
            </profile>
            <profile>
                <!-- 测试环境 -->
                <id>test</id>
                <properties>
                    <env>test</env>
                </properties>
            </profile>
        </profiles>
    

    maven部署构建之后查看项目 target/classess 中application.properties 文件验证是否修改成功

    总结

    如果有更好更优雅的解决方案希望留言学习下,谢谢!

    展开全文
  • 关于nginx多环境部署

    2018-10-31 14:26:01
    关于nginx多环境部署 背景 前后端完全分离,分处两个不同容器,相互网络互通,后端代码不更改情况下,前端直接请求导致跨域,所以最小更改原则,使用nginx转发 准备工作 变量 TEST DEMO ONLINE URL aa.test....

    关于nginx多环境部署

    背景

    前后端完全分离,分处两个不同容器,相互网络互通,后端代码不更改情况下,前端直接请求导致跨域,所以最小更改原则,使用nginx转发

    准备工作

    变量 TEST DEMO ONLINE
    URL aa.test.com aa.demo.com aa.online.com
    后端地址 172.22.xx.xxx:8090 172.16.xx.xxx:8090 aa-backend.online.com

    前端请求后端接口,由于涉及多环境,根据环境域名解析出到底使用哪个环境,主要使用nginx 提供的 proxy_pass 转发

    问题

    • 如何区分环境
      • 获取域名 ($host)
    • 如何确定是前端请求还是后端请求
      • 通过 url 中的path,xx.xx.xx/api/module/function ,以/api 的即为后端请求
    • no resolver defined to resolve
    • 需要在 location 中增加 resolver,原因是 nginx proxy_pass 使用域名时,无法解析,所以要指定resolver

    源码

    server {
        listen       80;
        server_name  -;
        #access_log  /var/log/nginx/host.access.log  main;
        set $gateway "172.22.xx.xxx:8090";
        location ~ ^/api {
            resolver 8.8.8.8;
            if ($host ~ "test") {
                 set $gateway "172.22.xx.xxx:8090";
            }
            if ($host ~ "demo") {
                 set $gateway "172.16.xx.xxx:8090";
            }
            if ($host ~ "online") {
                 set $gateway "aa-backend.online.com";
            }
            proxy_http_version 1.1;
            proxy_set_header Connection "keep-alive";
            proxy_set_header x-real-ip $remote_addr;
            proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
            proxy_next_upstream http_502 http_503 http_504 http_500 error timeout invalid_header;
            proxy_pass http://${gateway};
        }
        location / {
            alias   /usr/share/nginx/html/dist/;
            index  index.html;
            try_files $uri $uri/ /index.html;
        }
    }
    

    学如逆水行舟,不进则退。

    展开全文
  • 一,vue+egg+docker+jenkins+阿里云部署线上项目二,jenkins配置拉取git,部署远程云服务器,构建成功发送邮件通知三,腾讯云服务器配置vue打包静态项目和egg后端项目四,jenkins多环境部署项目,测试环境,预发...
    展开全文
  • SpringBoot Profile 实现一次war包多环境部署。 SpringMVC 在build war包阶段选择配置文件 目前我们的SpringMVC项目是通过在Conf目录下建立多个子目录(test-out,dev,production)。 在Maven build的时候,通过传入...
  • Eclipse中的Maven项目一键部署到Tomcat服务器 - 支持多环境部署场景说明:Java Maven Web项目编译、打包后,需要一键部署到研发或者测试服务器上,不用人工手动传包或者手动操作。利用Tomcat的热部署功能实现。环境...
  • @[TOC] jenkins 配置构建后操作(如多环境部署):插件 promoted builds plugin 应用场景 希望在构建成功或者单元测试通过之后部署 同一个构建部署到多个环境(开发环境,测试环境,预生产,线上) 构建成功后执行...
  • laravel 多环境部署

    千次阅读 2018-01-13 18:54:11
    转载地址 ...不同环境加载自己的.env.文件 这里面的.env.
  • 本章将主要介绍如何进行多环境部署,例如:DEV、FAT、PRO的环境部署。 专栏目录: 携程 Apollo 配置中心 | 学习笔记 序章 欢迎关注个人公众号: Coder编程 欢迎关注个人网站:www.52melrin.com 注:其实多环境...
  • 【云星数据—大数据部集群署系列007】:Zeppelin0.7.3多环境部署方案Zeppelin介绍Zeppelin是一个基于web的笔记本,支持交互式数据分析。你可以用SQL、Scala等做出数据驱动的、交互、协作的文档。(类似于ipython ...
  • Apollo 简介 Apollo配置中心介绍 微服务架构~携程Apollo...apollo-configservice、apollo-adminservice 服务和 ApolloConfigDB 需要在每个环境部署各一套 服务、数据库 本地模拟部署DEV(开发)、FAT(测试)、UAT
  • vue-cli项目接口地址可配置化(多环境部署)一处修改多处适用 本文档目的在于帮助对vue了解比较少的同学,能够快速配置vue应用中的接口地址。方便项目切换服务环境后,重新修改多组件的http请求地址...
  • spring cloud + nacos 多环境部署

    千次阅读 2020-01-18 10:38:25
    那么我们就需要将服务做多环境处理。我们现在使用都是spring boot架构,它可以根据配置文件的配置去匹配子文件后缀,不过在Spring cloud环境下使用了nacos作为配置中心需要使用bootstrap.yml替换 appliation,yml作为...
  • 利用Helm,可以快速安装常用的Kubernetes应用,可以针对同一个应用快速部署多环境,还可以实现运维人员与开发人员的职责分离。现在让我们安装并体现一下,如何通过Helm安装MongoDB吧。 Kubernetes环境搭建可参考:...
  • 上一篇文章我们着重讲解了springboot的一些基础配置,接下来我们来讲解springboot项目如何分环境部署在Spring Boot 中系统提供了更为简洁的方式。全局Profile配置我们使用application-{profile}.properties来定义,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,335
精华内容 8,934
关键字:

多环境部署