apollo 订阅
阿波罗是百度发布的名为“Apollo(阿波罗)”的向汽车行业及自动驾驶领域的合作伙伴提供的软件平台。发布时间是2017年4月19日,旨在向汽车行业及自动驾驶领域的合作伙伴提供一个开放、完整、安全的软件平台,帮助他们结合车辆和硬件系统,快速搭建一套属于自己的完整的自动驾驶系统。而将这个计划命名为“Apollo”计划,就是借用了阿波罗登月计划的含义。2018年2月15日,Apollo无人车亮相2018年中央电视台春节联欢晚会广东珠海分会场。在春晚直播中,百余辆Apollo无人车跨越港珠澳大桥。 [1]  4月19日,百度Apollo开放平台正式发布Apollo2.5版本。 [2]  11月7日,Apollo自动驾驶开放平台发布。 [3]  2019年1月,百度在拉斯维加斯举行的2019CES(消费电子展)上宣布,全球首个最全面智能驾驶商业化解决方案Apollo Enterprise正式问世。 [4]  2019年6月11日,百度Apollo入选“2019福布斯中国最具创新力企业榜”。 [5-6]  2019年9月26日,百度在长沙宣布,自动驾驶出租车队Robotaxi试运营正式开启。 [7] 展开全文
阿波罗是百度发布的名为“Apollo(阿波罗)”的向汽车行业及自动驾驶领域的合作伙伴提供的软件平台。发布时间是2017年4月19日,旨在向汽车行业及自动驾驶领域的合作伙伴提供一个开放、完整、安全的软件平台,帮助他们结合车辆和硬件系统,快速搭建一套属于自己的完整的自动驾驶系统。而将这个计划命名为“Apollo”计划,就是借用了阿波罗登月计划的含义。2018年2月15日,Apollo无人车亮相2018年中央电视台春节联欢晚会广东珠海分会场。在春晚直播中,百余辆Apollo无人车跨越港珠澳大桥。 [1]  4月19日,百度Apollo开放平台正式发布Apollo2.5版本。 [2]  11月7日,Apollo自动驾驶开放平台发布。 [3]  2019年1月,百度在拉斯维加斯举行的2019CES(消费电子展)上宣布,全球首个最全面智能驾驶商业化解决方案Apollo Enterprise正式问世。 [4]  2019年6月11日,百度Apollo入选“2019福布斯中国最具创新力企业榜”。 [5-6]  2019年9月26日,百度在长沙宣布,自动驾驶出租车队Robotaxi试运营正式开启。 [7]
信息
所属公司
百度 [8]
成立时间
2017年4月19日
外文名
Apollo [8]
中文名
阿波罗
涉及领域
汽车行业及自动驾驶领域 [8]
属    性
软件平台
阿波罗发布背景
2017年4月19日,百度又一次展示了自动驾驶领域领导者的大气风范,发布了一项名为“Apollo(阿波罗)”的新计划,向汽车行业及自动驾驶领域的合作伙伴提供一个开放、完整、安全的软件平台,帮助他们结合车辆和硬件系统,快速搭建一套属于自己的完整的自动驾驶系统。百度开放此项计划旨在建立一个以合作为中心的生态体系,发挥百度在人工智能领域的技术优势,促进自动驾驶技术的发展和普及。 [8]  而将这个计划命名为“Apollo”计划,就是借用了阿波罗登月计划的含义。 [8] 
收起全文
精华内容
下载资源
问答
  • Apollo

    2020-09-05 13:18:01
    3)理解Apollo的功能特性 4)掌握Apollo的快速入门方法 5) 理解Apollo的工作原理 6)能够安装Apollo 8)理解Apollo的核心概念 9)掌握Apollo的项目管理方法 9)掌握Apollo的配置管理方法 10)掌握Apollo集群...

    视频地址: https://www.bilibili.com/video/BV1eE41187sS?from=search&seid=14584196434337157306

    目录

    教学目标

    1 概览

    1.1 什么是配置

    1.2 什么是配置中心

    2 Apollo简介

    2.1 主流配置中心

    2.2 Apollo简介

    2.3 Apollo特性

    3 Apollo快速入门

    3.1 执行流程

    3.2 安装Apollo

    3.3 代码实现

    4 Apollo应用

    4.1 Apollo工作原理

    4.2 核心概念

    4.3 项目管理

    4.4 配置管理

    4.5 多项目配置

    4.6 集群管理

    4.7 配置发布原理

    5 Apollo应用于分布式系统

    5.1 项目场景介绍

    5.2 Spring Boot应用集成

    5.4 生产环境部署

    5.5 灰度发布



    教学目标

    1)理解配置中心的概念以及使用场景

    2)了解主流配置中心

    3)理解Apollo的功能特性

    4)掌握Apollo的快速入门方法

    5) 理解Apollo的工作原理

    6)能够安装Apollo

    8)理解Apollo的核心概念

    9)掌握Apollo的项目管理方法

    9)掌握Apollo的配置管理方法

    10)掌握Apollo集群管理方法

    11)理解Apollo的配置发布原理

    12)掌握SpringBoot 集成Apollo的使用方法

    13)掌握Apollo生产环境的部署方法

    14)掌握Apollo灰度发布的方法

     

    1 概览

    1.1 什么是配置

    应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数据库连接参数、启动参数等。

    配置主要有以下几个特点:

    • 配置是独立于程序的只读变量
      • 配置首先是独立于程序的,同一份程序在不同的配置下会有不同的行为
      • 其次,配置对于程序是只读的,程序通过读取配置来改变自己的行为,但是程序不应该去改变配置
    • 配置伴随应用的整个生命周期
      • 配置贯穿于应用的整个生命周期,应用在启动时通过读取配置来初始化,在运行时根据配置调整行为。比如:启动时需要读取服务的端口号、系统在运行过程中需要读取定时策略执行定时任务等。
    • 配置可以有多种加载方式
      • 常见的有程序内部硬编码,配置文件,环境变量,启动参数,基于数据库等
    • 配置需要治理
      • 权限控制:由于配置能改变程序的行为,不正确的配置甚至能引起灾难,所以对配置的修改必须有比较完善的权限控制
      • 不同环境、集群配置管理:同一份程序在不同的环境(开发,测试,生产)、不同的集群(如不同的数据中心)经常需要有不同的配置,所以需要有完善的环境、集群配置管理

    1.2 什么是配置中心

    ​ 传统单体应用存在一些潜在缺陷,如随着规模的扩大,部署效率降低,团队协作效率差,系统可靠性变差,维护困难,新功能上线周期长等,所以迫切需要一种新的架构去解决这些问题,而微服务

    ( microservices )架构正是当下一种流行的解法。

    ​ 不过,解决一个问题的同时,往往会诞生出很多新的问题,所以微服务化的过程中伴随着很多的挑战,其中一个挑战就是有关服务(应用)配置的。当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此,分散中还包含着冗余,如下图:

    img

    配置中心将配置从应用中剥离出来,统一管理,优雅的解决了配置的动态变更、持久化、运维成本等问题。

    应用自身既不需要去添加管理配置接口,也不需要自己去实现配置的持久化,更不需要引入“定时任务”以便降低运维成本。

    ​ 总得来说,配置中心就是一种统一管理各种应用配置的基础服务组件。

    ​ 在系统架构中,配置中心是整个微服务基础架构体系中的一个组件,如下图,它的功能看上去并不起眼,无非就是配置的管理和存取,但它是整个微服务架构中不可或缺的一环。

    image-20190621162125196

    ​ 集中管理配置,那么就要将应用的配置作为一个单独的服务抽离出来了,同理也需要解决新的问题,比如:版本管理(为了支持回滚),权限管理等。

    ​ 总结一下,在传统巨型单体应用纷纷转向细粒度微服务架构的历史进程中,配置中心是微服务化不可缺少的一个系统组件,在这种背景下中心化的配置服务即配置中心应运而生,一个合格的配置中心需要满足:

    • 配置项容易读取和修改

    • 添加新配置简单直接

    • 支持对配置的修改的检视以把控风险

    • 可以查看配置修改的历史记录

    • 不同部署环境支持隔离

    2 Apollo简介

    2.1 主流配置中心

    目前市面上用的比较多的配置中心有:(按开源时间排序)

    1. Disconf

    2014年7月百度开源的配置管理中心,专注于各种「分布式系统配置管理」的「通用组件」和「通用平台」, 提供统一的「配置管理服务」。目前已经不再维护更新。

    https://github.com/knightliao/disconf

    1. Spring Cloud Config

    2014年9月开源,Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合。

    https://github.com/spring-cloud/spring-cloud-config

    1. Apollo

    2016年5月,携程开源的配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

    https://github.com/ctripcorp/apollo

    1. Nacos

    2018年6月,阿里开源的配置中心,也可以做DNS和RPC的服务发现。

    https://github.com/alibaba/nacos

    2.1.1 功能特性对比

    由于Disconf不再维护,下面主要对比一下Spring Cloud Config、Apollo和Nacos。

    功能点 Spring Cloud Config Apollo Nacos
    配置实时推送 支持(Spring Cloud Bus) 支持(HTTP长轮询1s内) 支持(HTTP长轮询1s内)
    版本管理 支持(Git) 支持 支持
    配置回滚 支持(Git) 支持 支持
    灰度发布 支持 支持 不支持
    权限管理 支持(依赖Git) 支持 不支持
    多集群 支持 支持 支持
    多环境 支持 支持 支持
    监听查询 支持 支持 支持
    多语言 只支持Java 主流语言,提供了Open API 主流语言,提供了Open API
    配置格式校验 不支持 支持 支持
    单机读(QPS) 7(限流所致) 9000 15000
    单击写(QPS) 5(限流所致) 1100 1800
    3节点读(QPS) 21(限流所致) 27000 45000
    3节点写(QPS) 5限流所致() 3300 5600

    2.1.2 总结

    总的来看,Apollo和Nacos相对于Spring Cloud Config的生态支持更广,在配置管理流程上做的更好。Apollo相对于Nacos在配置管理做的更加全面,Nacos则使用起来相对比较简洁,在对性能要求比较高的大规模场景更适合。但对于一个开源项目的选型,项目上的人力投入(迭代进度、文档的完整性)、社区的活跃度(issue的数量和解决速度、Contributor数量、社群的交流频次等),这些因素也比较关键,考虑到Nacos开源时间不长和社区活跃度,所以从目前来看Apollo应该是最合适的配置中心选型。

    2.2 Apollo简介

    1572480470442

    Apollo - A reliable configuration management system

    https://github.com/ctripcorp/apollo

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

    Apollo包括服务端和客户端两部分:

    服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。

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

    2.3 Apollo特性

    基于配置的特殊性,所以Apollo从设计之初就立志于成为一个有治理能力的配置发布平台,目前提供了以下的特性:

    • 统一管理不同环境、不同集群的配置
      • Apollo提供了一个统一界面集中式管理不同环境(environment)、不同集群(cluster)、不同命名空间(namespace)的配置。
      • 同一份代码部署在不同的集群,可以有不同的配置,比如zookeeper的地址等
      • 通过命名空间(namespace)可以很方便地支持多个不同应用共享同一份配置,同时还允许应用对共享的配置进行覆盖
    • 配置修改实时生效(热发布)
      • 用户在Apollo修改完配置并发布后,客户端能实时(1秒)接收到最新的配置,并通知到应用程序
    • 版本发布管理
      • 所有的配置发布都有版本概念,从而可以方便地支持配置的回滚
    • 灰度发布
      • 支持配置的灰度发布,比如点了发布后,只对部分应用实例生效,等观察一段时间没问题后再推给所有应用实例
    • 权限管理、发布审核、操作审计
      • 应用和配置的管理都有完善的权限管理机制,对配置的管理还分为了编辑和发布两个环节,从而减少人为的错误。
      • 所有的操作都有审计日志,可以方便地追踪问题
    • 客户端配置信息监控
      • 可以在界面上方便地看到配置在被哪些实例使用
    • 提供Java和.Net原生客户端
      • 提供了Java和.Net的原生客户端,方便应用集成
      • 支持Spring Placeholder, Annotation和Spring Boot的ConfigurationProperties,方便应用使用(需要Spring 3.1.1+)
      • 同时提供了Http接口,非Java和.Net应用也可以方便地使用
    • 提供开放平台API
      • Apollo自身提供了比较完善的统一配置管理界面,支持多环境、多数据中心配置管理、权限、流程治理等特性。不过Apollo出于通用性考虑,不会对配置的修改做过多限制,只要符合基本的格式就能保存,不会针对不同的配置值进行针对性的校验,如数据库用户名、密码,Redis服务地址等
      • 对于这类应用配置,Apollo支持应用方通过开放平台API在Apollo进行配置的修改和发布,并且具备完善的授权和权限控制

    3 Apollo快速入门

    3.1 执行流程

    client-architecture

    操作流程如下:

    1、在Apollo配置中心修改配置

    2、应用程序通过Apollo客户端从配置中心拉取配置信息

    ​ 用户通过Apollo配置中心修改或发布配置后,会有两种机制来保证应用程序来获取最新配置:一种是Apollo配置中心会向客户端推送最新的配置;另外一种是Apollo客户端会定时从Apollo配置中心拉取最新的配置,通过以上两种机制共同来保证应用程序能及时获取到配置。

    3.2 安装Apollo

    3.2.1 运行时环境

    Java

    • Apollo服务端:1.8+
    • Apollo客户端:1.7+

    由于需要同时运行服务端和客户端,所以建议安装Java 1.8+。

    MySQL

    • 版本要求:5.6.5+

    Apollo的表结构对timestamp使用了多个default声明,所以需要5.6.5以上版本。

    3.2.2 下载配置

    1. 访问Apollo的官方主页获取安装包(本次使用1.3版本):

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

    image-20190916182125537

    1. 打开1.3发布链接,下载必须的安装包:https://github.com/ctripcorp/apollo/releases/tag/v1.3.0

    image-20190916182704171

    1. 解压安装包后将apollo-configservice-1.3.0.jar, apollo-adminservice-1.3.0.jar, apollo-portal-1.3.0.jar放置于apollo目录下

    3.2.3 创建数据库

    Apollo服务端共需要两个数据库:ApolloPortalDBApolloConfigDB,ApolloPortalDB只需要在生产环境部署一个即可,而ApolloConfigDB需要在每个环境部署一套。

    1. 创建ApolloPortalDB,sql脚本下载地址:https://github.com/ctripcorp/apollo/blob/v1.3.0/scripts/db/migration/configdb/V1.0.0__initialization.sql

    以MySQL原生客户端为例:

       source apollo/ApolloPortalDB__initialization.sql
    
    1. 验证ApolloPortalDB

    导入成功后,可以通过执行以下sql语句来验证:

       select `Id`, `Key`, `Value`, `Comment` from `ApolloPortalDB`.`ServerConfig` limit 1;
    

    注:ApolloPortalDB只需要在生产环境部署一个即可

    1. 创建ApolloConfigDB,sql脚本下载地址:https://github.com/ctripcorp/apollo/blob/v1.3.0/scripts/db/migration/configdb/V1.0.0__initialization.sql

    以MySQL原生客户端为例:

       source apollo/ApolloConfigDB__initialization.sql
    
    1. 验证ApolloConfigDB

    导入成功后,可以通过执行以下sql语句来验证:

       select `Id`, `Key`, `Value`, `Comment` from `ApolloConfigDB`.`ServerConfig` limit 1;
    

    3.2.4 启动Apollo

    1. 确保端口未被占用

    Apollo默认会启动3个服务,分别使用8070, 8080, 8090端口,请确保这3个端口当前没有被使用

    1. 启动apollo-configservice,在apollo目录下执行如下命令

    可通过-Dserver.port=8080修改默认端口

       java -Xms256m -Xmx256m -Dspring.datasource.url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=root -Dspring.datasource.password=pbteach0430 -jar apollo-configservice-1.3.0.jar
    

    image-20190916185334497

    1. 启动apollo-adminservice

    可通过-Dserver.port=8090修改默认端口

       java -Xms256m -Xmx256m -Dspring.datasource.url=jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=root -Dspring.datasource.password=pbteach0430 -jar apollo-adminservice-1.3.0.jar
    

    image-20190917100531147

    1. 启动apollo-portal

    可通过-Dserver.port=8070修改默认端口

       java -Xms256m -Xmx256m -Ddev_meta=http://localhost:8080/ -Dserver.port=8070 -Dspring.datasource.url=jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8 -Dspring.datasource.username=root -Dspring.datasource.password=pbteach0430 -jar apollo-portal-1.3.0.jar
    

    image-20190917100803548

    1. 也可以使用提供的runApollo.bat快速启动三个服务(修改数据库连接地址,数据库以及密码)
       echo
    
       set url="localhost:3306"
       set username="root"
       set password="123"
    
       start "configService" java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://%url%/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-configservice.log -jar .\apollo-configservice-1.3.0.jar
       start "adminService" java -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://%url%/ApolloConfigDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-adminservice.log -jar .\apollo-adminservice-1.3.0.jar
       start "ApolloPortal" java -Xms256m -Xmx256m -Dapollo_profile=github,auth -Ddev_meta=http://localhost:8080/ -Dserver.port=8070 -Dspring.datasource.url=jdbc:mysql://%url%/ApolloPortalDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-portal.log -jar .\apollo-portal-1.3.0.jar
    
    1. 运行runApollo.bat即可启动Apollo

    2. 待启动成功后,访问管理页面 apollo/admin

    image-20190716095006110

    3.3 代码实现

    3.3.1 发布配置

    1. 打开apollo :新建项目apollo-quickstart

    image-20190919144634885

    1. 新建配置项sms.enable

    image-20190919144817438

    确认提交配置项

    image-20190716091009049

    1. 发布配置项image-20190716091034424

    3.3.2 应用读取配置

    1、新建Maven工程

    打开idea,新建apollo-quickstart项目

    image-20190919113331126

    image-20190919141052497

    打开pom.xml文件添加apollo依赖,配置JDK为1.8

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.pbteach</groupId>
        <artifactId>apollo-quickstart</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>com.ctrip.framework.apollo</groupId>
                <artifactId>apollo-client</artifactId>
                <version>1.1.0</version>
            </dependency>
    
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-simple</artifactId>
                <version>1.7.28</version>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>8</source>
                        <target>8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

    2、编写测试类GetConfigTest

    新建com.pbteach.apollo.quickstart包,添加测试类GetConfigTest

    添加如下代码读取sms.enable的值

    package com.pbteach.apollo.quickstart;
    
    public class GetConfigTest {
    
    	// VM options:
    	// -Dapp.id=apollo-quickstart -Denv=DEV -Ddev_meta=http://localhost:8080
    	public static void main(String[] args) {
    		Config config = ConfigService.getAppConfig();
    		String someKey = "sms.enable";
    		String value = config.getProperty(someKey, null);
    		System.out.println("sms.enable: " + value);
    	}
    }
    

    3、测试

    配置VM options,设置系统属性:

    -Dapp.id=apollo-quickstart -Denv=DEV -Ddev_meta=http://localhost:8080
    

    image-20190919145322810

    运行GetConfigTest,打开控制台,观察输出结果

    image-20190916171554598

    3.3.4 修改配置

    1. 修改sms.enable的值为false

    image-20190919145948976

    1. 再次运行GetConfigTest,可以看到输出结果已为false

    image-20190919150422055

    3.3.5 热发布

    1. 修改代码为每3秒获取一次
       public class GetConfigTest {
    
       	public static void main(String[] args) throws InterruptedException {
       		Config config = ConfigService.getAppConfig();
       		String someKey = "sms.enable";
    
       		while (true) {
       			String value = config.getProperty(someKey, null);
       			System.out.printf("now: %s, sms.enable: %s%n", LocalDateTime.now().toString(), value);
       			Thread.sleep(3000L);
       		}
       	}
       }
    
    1. 运行GetConfigTest观察输出结果

    image-20190919150514947

    1. 在Apollo管理界面修改配置项

    image-20190716091957990

    1. 发布配置

    image-20190716092045381

    1. 在控制台查看详细情况:可以看到程序获取的sms.enable的值已由false变成了修改后的true

    image-20190919150725071

    4 Apollo应用

    4.1 Apollo工作原理

    下图是Apollo架构模块的概览

    overall-architecture

    4.1.1 各模块职责

    上图简要描述了Apollo的总体设计,我们可以从下往上看:

    • Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端
    • Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)
    • Eureka提供服务注册和发现,为了简单起见,目前Eureka在部署时和Config Service是在一个JVM进程中的
    • Config Service和Admin Service都是多实例、无状态部署,所以需要将自己注册到Eureka中并保持心跳
    • 在Eureka之上架了一层Meta Server用于封装Eureka的服务发现接口
    • Client通过域名访问Meta Server获取Config Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Client侧会做load balance、错误重试
    • Portal通过域名访问Meta Server获取Admin Service服务列表(IP+Port),而后直接通过IP+Port访问服务,同时在Portal侧会做load balance、错误重试
    • 为了简化部署,我们实际上会把Config Service、Eureka和Meta Server三个逻辑角色部署在同一个JVM进程中

    4.1.2 分步执行流程

    1. Apollo启动后,Config/Admin Service会自动注册到Eureka服务注册中心,并定期发送保活心跳。
    2. Apollo Client和Portal管理端通过配置的Meta Server的域名地址经由Software Load Balancer(软件负载均衡器)进行负载均衡后分配到某一个Meta Server
    3. Meta Server从Eureka获取Config Service和Admin Service的服务信息,相当于是一个Eureka Client
    4. Meta Server获取Config Service和Admin Service(IP+Port)失败后会进行重试
    5. 获取到正确的Config Service和Admin Service的服务信息后,Apollo Client通过Config Service为应用提供配置获取、实时更新等功能;Apollo Portal管理端通过Admin Service提供配置新增、修改、发布等功能

    4.2 核心概念

    1. application (应用)

    这个很好理解,就是实际使用配置的应用,Apollo客户端在运行时需要知道当前应用是谁,从而可以去获取对应的配置

    关键字:appId

    1. environment (环境)

    配置对应的环境,Apollo客户端在运行时需要知道当前应用处于哪个环境,从而可以去获取应用的配置

    关键字:env

    1. cluster (集群)

    一个应用下不同实例的分组,比如典型的可以按照数据中心分,把上海机房的应用实例分为一个集群,把北京机房的应用实例分为另一个集群。

    关键字:cluster

    1. namespace (命名空间)

    一个应用下不同配置的分组,可以简单地把namespace类比为文件,不同类型的配置存放在不同的文件中,如数据库配置文件,RPC配置文件,应用自身的配置文件等

    关键字:namespaces

    它们的关系如下图所示:

    image-20190919170234623

    4.3 项目管理

    4.3.1 基础设置

    1. 部门管理

    apollo 默认部门有两个。要增加自己的部门,可在系统参数中修改:

    • 进入系统参数设置

    image-20190716115120642

    • 输入key查询已存在的部门设置:organizations

      image-20190716115230543

    • 修改value值来添加新部门,下面添加一个微服务部门:

       [{"orgId":"TEST1","orgName":"样例部门1"},{"orgId":"TEST2","orgName":"样例部门2"},{"orgId":"micro_service","orgName":"微服务部门"}]
      
    1. 添加用户

    apollo默认提供一个超级管理员: apollo,可以自行添加用户

    • 新建用户张三

    image-20190720181559923

    image-20190720181647695

    4.3.2 创建项目

    1. 打开apollo-portal主页:http://localhost:8070/

    2. 点击“创建项目”:account-service

    image-20190716101236392

    1. 输入项目信息

      • 部门:选择应用所在的部门
      • 应用AppId:用来标识应用身份的唯一id,格式为string,需要和项目配置文件applications.properties中配置的app.id对应
      • 应用名称:应用名,仅用于界面展示
      • 应用负责人:选择的人默认会成为该项目的管理员,具备项目权限管理、集群创建、Namespace创建等权限

    image-20190716101502009

    1. 点击提交

    创建成功后,会自动跳转到项目首页

    image-20190716101909047

    1. 赋予之前添加的用户张三管理account-service服务的权限

      • 使用管理员apollo将指定项目授权给用户张三

      image-20190720182520071

      • 将修改和发布权限都授权给张三

      image-20190720182858984

      • 使用zhangsan登录,查看项目配置

      image-20190720183023342

      • 点击account-service即可管理配置

    4.3.3 删除项目

    如果要删除整个项目,点击右上角的“管理员工具–----》删除应用、集群…”

    首先查询出要删除的项目,点击“删除应用”

    1570248995936

    4.4 配置管理

    下边在account-service项目中进行配置。

    4.4.1 添加发布配置项

    1. 通过表格模式添加配置

      • 点击新增配置

      image-20190917113735222

      • 输入配置项:sms.enable,点击提交

      image-20190917113829772

    2. 通过文本模式编辑

    Apollo除了支持表格模式,逐个添加、修改配置外,还提供文本模式批量添加、修改。 这个对于从已有的properties文件迁移尤其有用

    • 切换到文本编辑模式

      image-20190917113953166

    • 输入配置项,并点击提交修改

      image-20190917114051248

    1. 发布配置

    image-20190917114118871

    4.4.2 修改配置

    1. 找到对应的配置项,点击修改

    image-20190917114952136

    1. 修改为需要的值,点击提交

    2. 发布配置

    4.4.3 删除配置

    1. 找到需要删除的配置项,点击删除

    image-20190917140811049

    1. 确认删除后,点击发布

    image-20190917140920348

    4.4.4 添加Namespace

    Namespace作为配置的分类,可当成一个配置文件。

    以添加rocketmq配置为例,添加“spring-rocketmq” Namespace配置rocketmq相关信息。

    1. 添加项目私有Namespace:spring-rocketmq

    进入项目首页,点击左下脚的“添加Namespace”,共包括两项:关联公共Namespace和创建Namespace,这里选择“创建Namespace”

    image-20190716135746538

    1. 添加配置项
       rocketmq.name-server = 127.0.0.1:9876
       rocketmq.producer.group = PID_ACCOUNT
    

    image-20190716141257636

    1. 发布配置

    image-20190716141330583

    4.4.5 公共配置

    4.4.5.1 添加公共Namespace

    在项目开发中,有一些配置可能是通用的,我们可以通过把这些通用的配置放到公共的Namespace中,这样其他项目要使用时可以直接添加需要的Namespace

    1. 新建common-template项目

    image-20190716104213113

    1. 添加公共Namespace:spring-boot-http

    进入common-template项目管理页面:http://localhost:8070/config.html?#/appid=common-template

    image-20190716104856041

    1. 添加配置项并发布
       spring.http.encoding.enabled = true
       spring.http.encoding.charset = UTF-8
       spring.http.encoding.force = true
       server.tomcat.remote_ip_header = x-forwarded-for
       server.tomcat.protocol_header = x-forwarded-proto
       server.use-forward-headers = true
       server.servlet.context-path = /
    

    image-20190917141904861

    4.4.5.2 关联公共Namespace

    1. 打开之前创建的account-service项目

    2. 点击左侧的添加Namespace

    1. 添加Namespace

    image-20190716111600622

     

    1. 根据需求可以覆盖引入公共Namespace中的配置,下面以覆盖server.servlet.context-path为例

    image-20190716111914846

    1. 修改server.servlet.context-path为:/account-service

    image-20190716112948132

    1. 发布修改的配置项

    image-20190716113330392

    4.5 多项目配置

    通常一个分布式系统包括多个项目,所以需要多个项目,下边以一个P2P金融的项目为例,添加交易中心微服务transaction-service。

    1. 添加交易中心微服务transaction-service

    image-20190917171820325

    1. 关联公共Namespace

    任务应用都可以关联公共Namespace。

    image-20190917171916225

    1. 覆盖配置,修改交易中心微服务的context-path为:/transaction

    image-20190917172050995

    1. 发布修改后的配置

    4.6 集群管理

    在有些情况下,应用有需求对不同的集群做不同的配置,比如部署在A机房的应用连接的RocketMQ服务器地址和部署在B机房的应用连接的RocketMQ服务器地址不一样。另外在项目开发过程中,也可为不同的开发人员创建不同的集群来满足开发人员的自定义配置。

    4.6.1 创建集群

    1. 点击页面左侧的“添加集群”按钮

    image-20190716142112080

    1. 输入集群名称SHAJQ,选择环境并提交:添加上海金桥数据中心为例

    image-20190716142454845

    1. 切换到对应的集群,修改配置并发布即可

    image-20190716142906278

    4.6.2 同步集群配置

    同步集群的配置是指在同一个应用中拷贝某个环境下的集群的配置到目标环境下的目标集群。

    1. 从其他集群同步已有配置到新集群

      • 切换到原有集群

      • 展开要同步的Namespace,点击同步配置

      image-20190716143608936

      • 选择同步到的新集群,再选择要同步的配置

      image-20190716143755503

      • 同步完成后,切换到SHAJQ集群,发布配置

      image-20190716143933267

    4.6.3 读取配置

    读取某个集群的配置,需要启动应用时指定具体的应用、环境和集群。

    -Dapp.id=应用名称

    -Denv=环境名称

    -Dapollo.cluster=集群名称

    -D环境_meta=meta地址

    -Dapp.id=account-service -Denv=DEV -Dapollo.cluster=SHAJQ -Ddev_meta=http://localhost:8080 
    

    4.7 配置发布原理

    在配置中心中,一个重要的功能就是配置发布后实时推送到客户端。下面我们简要看一下这块是怎么设计实现的。

    release-message-notification-design-8613796

    上图简要描述了配置发布的主要过程:

    1. 用户在Portal操作配置发布
    2. Portal调用Admin Service的接口操作发布
    3. Admin Service发布配置后,发送ReleaseMessage给各个Config Service
    4. Config Service收到ReleaseMessage后,通知对应的客户端

    4.7.1 发送ReleaseMessage

    Admin Service在配置发布后,需要通知所有的Config Service有配置发布,从而Config Service可以通知对应的客户端来拉取最新的配置。

    从概念上来看,这是一个典型的消息使用场景,Admin Service作为producer(生产者)发出消息,各个Config Service作为consumer(消费者)消费消息。通过一个消息队列组件(Message Queue)就能很好的实现Admin Service和Config Service的解耦。

    在实现上,考虑到Apollo的实际使用场景,以及为了尽可能减少外部依赖,我们没有采用外部的消息中间件,而是通过数据库实现了一个简单的消息队列。

    具体实现方式如下:

    1. Admin Service在配置发布后会往ReleaseMessage表插入一条消息记录,消息内容就是配置发布的AppId+Cluster+Namespace
       SELECT * FROM ApolloConfigDB.ReleaseMessage
    

    image-20190918142607113

    消息发送类:DatabaseMessageSende

    image-20190918143135480

    1. Config Service有一个线程会每秒扫描一次ReleaseMessage表,看看是否有新的消息记录

    消息扫描类:ReleaseMessageScanner

    image-20190918143454666

    1. Config Service如果发现有新的消息记录,那么就会通知到所有的消息监听器

    image-20190918143832024

    然后调用消息监听类的handleMessage方法:NotificationControllerV2

    image-20190918144207638

    1. NotificationControllerV2得到配置发布的AppId+Cluster+Namespace后,会通知对应的客户端

    release-message-design

    4.7.2 Config Service通知客户端

    上一节中简要描述了NotificationControllerV2是如何得知有配置发布的,那NotificationControllerV2在得知有配置发布后是如何通知到客户端的呢?

    实现方式如下:

    1. 客户端会发起一个Http请求到Config Service的notifications/v2接口NotificationControllerV2

    image-20190918145100432

    客户端发送请求类:RemoteConfigLongPollService

    image-20190918150801655

    1. NotificationControllerV2不会立即返回结果,而是把请求挂起。考虑到会有数万客户端向服务端发起长连,因此在服务端使用了async servlet(Spring DeferredResult)来服务Http Long Polling请求。

    2. 如果在60秒内没有该客户端关心的配置发布,那么会返回Http状态码304给客户端。

    3. 如果有该客户端关心的配置发布,NotificationControllerV2会调用DeferredResult的setResult方法,传入有配置变化的namespace信息,同时该请求会立即返回。客户端从返回的结果中获取到配置变化的namespace后,会立即请求Config Service获取该namespace的最新配置。

    4.7.3 客户端读取设计

    除了之前介绍的客户端和服务端保持一个长连接,从而能第一时间获得配置更新的推送外,客户端还会定时从Apollo配置中心服务端拉取应用的最新配置

    • 这是一个备用机制,为了防止推送机制失效导致配置不更新

    • 客户端定时拉取会上报本地版本,所以一般情况下,对于定时拉取的操作,服务端都会返回304 - Not Modified

    • 定时频率默认为每5分钟拉取一次,客户端也可以通过在运行时指定System Property: apollo.refreshInterval来覆盖,单位为分钟

    5 Apollo应用于分布式系统

    在微服务架构模式下,项目往往会切分成多个微服务,下面将以万信金融P2P项目为例演示如何在项目中使用。

    5.1 项目场景介绍

    5.1.1 项目概述

    ​ 万信金融是一款面向互联网大众提供的理财服务和个人消费信贷服务的金融平台,依托大数据风控技术,为用户提供方便、快捷、安心的P2P金融服务。本项目包括交易平台和业务支撑两个部分,交易平台主要实现理财服务,包括:借钱、出借等模块,业务支撑包括:标的管理、对账管理、风控管理等模块。项目采用先进的互联网技术进行研发,保证了P2P双方交易的安全性、快捷性及稳定性。

    5.1.2 各微服务介绍

    本章节仅仅是为了演示配置中心,所以摘取了部分微服务,如下:

    用户中心服务(consumer-service):为借款人和投资人提供用户账户管理服务,包括:注册、开户、充值、提现等

    UAA认证服务(uaa-service):为用户中心的用户提供认证服务

    统一账户服务(account-service):对借款人和投资人的登录平台账号进行管理,包括:注册账号、账号权限管理等

    交易中心(transaction-service):负责P2P平台用户发标和投标功能

    5.2 Spring Boot应用集成

    下面以集成统一账户服务(account-service)为例

    5.2.1 导入工程

    参考account-service、transaction-service、uaa-service、consumer-service工程,手动创建这几个微服务。

    每个工程必须添加依赖:

    <dependency>
      <groupId>com.ctrip.framework.apollo</groupId>
      <artifactId>apollo-client</artifactId>
      <version>1.1.0</version>
    </dependency>
    

    下边是account-service依赖,其它工程参考“资料”下的“微服务”。

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.3.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.pbteach</groupId>
        <artifactId>account-service</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-starter-logging</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-log4j2</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
    
            <dependency>
                <groupId>com.ctrip.framework.apollo</groupId>
                <artifactId>apollo-client</artifactId>
                <version>1.1.0</version>
            </dependency>
    
        </dependencies>
    
    </project>
    
    

    5.2.2 必选配置

    1. AppId:在Spring Boot application.properties或application.yml中配置

    application.properties

       app.id=account-service
    

    application.yml

       app:
       	id: account-service
    
    1. apollo.bootstrap

    集成springboot,开启apollo.bootstrap,指定namespace

    例子:

       apollo.bootstrap.enabled = true
       apollo.bootstrap.namespaces = application,micro_service.spring-boot-http,spring-rocketmq,micro_service.spring-boot-druid
    
    
    1. Apollo Meta Server

    Apollo支持应用在不同的环境有不同的配置,常用的指定方式有如下两种:

    • 第一种:通过Java System Property的apollo.meta:-Dapollo.meta=http://localhost:8080

    • 第二种:在resources目录下新建apollo-env.properties文件

       dev.meta=http://localhost:8080
       pro.meta=http://localhost:8081
      
    1. 本地缓存路径

    Apollo客户端会把从服务端获取到的配置在本地文件系统缓存一份,用于在遇到服务不可用,或网络不通的时候,依然能从本地恢复配置,不影响应用正常运行。本地配置文件会以下面的文件名格式放置于配置的本地缓存路径下:{appId}+{cluster}+{namespace}.properties

    image-20190716144411934

    可以通过如下方式指定缓存路径,通过Java System Property的apollo.cacheDir:

       -Dapollo.cacheDir=/opt/data/apollo-config
    
    1. Environment

    通过Java System Property的env来指定环境:-Denv=DEV

    1. Cluster(集群)

    通过Java System Property的apollo.cluste来指定集群:-Dapollo.cluster=DEFAULT

    也可以选择使用之前新建的SHAJQ集群:-Dapollo.cluster=SHAJQ

    1. 完整的VM Options如下:
       -Denv=DEV -Dapollo.cacheDir=/opt/data/apollo-config -Dapollo.cluster=DEFAULT
    

    5.2.3 启用配置

    在咱们应用的启动类添加@EnableApolloConfig注解即可:

    @SpringBootApplication(scanBasePackages = "com.pbteach.account")
    @EnableApolloConfig
    public class AccountApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(AccountApplication.class, args);
    	}
    }
    

    5.2.4 应用配置

    1. 将local-config/account.properties中的配置添加到apollo中
       swagger.enable=true
       sms.enable=true
    
       spring.http.encoding.charset=UTF-8
       spring.http.encoding.force=true
       spring.http.encoding.enabled=true
       server.use-forward-headers=true
       server.tomcat.protocol_header=x-forwarded-proto
       server.servlet.context-path=/account-service
       server.tomcat.remote_ip_header=x-forwarded-for
    
       spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
       spring.datasource.druid.stat-view-servlet.allow=127.0.0.1,192.168.163.1
       spring.datasource.druid.web-stat-filter.session-stat-enable=false
       spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
       spring.datasource.druid.max-active=20
       spring.datasource.druid.stat-view-servlet.reset-enable=false
       spring.datasource.druid.validation-query=SELECT 1 FROM DUAL
       spring.datasource.druid.stat-view-servlet.enabled=true
       spring.datasource.druid.web-stat-filter.enabled=true
       spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
       spring.datasource.druid.stat-view-servlet.deny=192.168.1.73
       spring.datasource.url=jdbc\:mysql\://127.0.0.1\:3306/p2p_account?useUnicode\=true
       spring.datasource.druid.filters=config,stat,wall,log4j2
       spring.datasource.druid.test-on-return=false
       spring.datasource.druid.web-stat-filter.profile-enable=true
       spring.datasource.druid.initial-size=5
       spring.datasource.druid.min-idle=5
       spring.datasource.druid.max-wait=60000
       spring.datasource.druid.web-stat-filter.session-stat-max-count=1000
       spring.datasource.druid.pool-prepared-statements=true
       spring.datasource.druid.test-while-idle=true
       spring.datasource.password=pbteach0430
       spring.datasource.username=root
       spring.datasource.druid.stat-view-servlet.login-password=admin
       spring.datasource.druid.stat-view-servlet.login-username=admin
       spring.datasource.druid.web-stat-filter.url-pattern=/*
       spring.datasource.druid.time-between-eviction-runs-millis=60000
       spring.datasource.druid.min-evictable-idle-time-millis=300000
       spring.datasource.druid.test-on-borrow=false
       spring.datasource.druid.web-stat-filter.principal-session-name=admin
       spring.datasource.druid.filter.stat.log-slow-sql=true
       spring.datasource.druid.web-stat-filter.principal-cookie-name=admin
       spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
       spring.datasource.druid.aop-patterns=com.pbteach.wanxinp2p.*.service.*
       spring.datasource.druid.filter.stat.slow-sql-millis=1
       spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
    
    

     

    1. spring-http命名空间在之前已通过关联公共命名空间添加好了,现在来添加spring-boot-druid命名空间
    2. 添加本地文件中的配置到对应的命名空间,然后发布配置

    image-20190919184636687

    1. 在account-service/src/main/resources/application.properties中配置apollo.bootstrap.namespaces需要引入的命名空间
      app.id=account-service
      apollo.bootstrap.enabled = true
      apollo.bootstrap.namespaces = application,micro_service.spring-boot-http,spring-rocketmq,spring-boot-druid
    
      server.port=63000
    

    5.2.5 读取配置

    1. 启动应用
    2. 访问:http://127.0.0.1:63000/account-service/hi,确认Spring Boot中配置的context-path是否生效

    image-20190716145112160

    通过/account-service能正常访问,说明apollo的配置已生效

    1. 确认spring-boot-druid配置

      • 为了快速确认可以在AccountController中通过@Value获取来验证
          @GetMapping("/db-url")
          public String getDBConfig(@Value("${spring.datasource.url}") String url) {
       return url;
          }
      

    5.3.6 创建其它项目

    参考account-service将其它项目也创建完成。

    5.4 生产环境部署

    当一个项目要上线部署到生产环境时,项目的配置比如数据库连接、RocketMQ地址等都会发生变化,这时候就需要通过Apollo为生产环境添加自己的配置。

    5.4.1 企业部署方案

    在企业中常用的部署方案为:Apollo-adminservice和Apollo-configservice两个服务分别在线上环境(pro),仿真环境(uat)和开发环境(dev)各部署一套,Apollo-portal做为管理端只部署一套,统一管理上述三套环境。

    具体如下图所示:

    deployment

    下面以添加生产环境部署为例

    5.4.2 创建数据库

    创建生产环境的ApolloConfigDB:每添加一套环境就需要部署一套ApolloConfgService和ApolloAdminService

    source apollo/ApolloConfigDB_PRO__initialization.sql

    5.4.3 配置启动参数

    1. 设置生产环境数据库连接
    2. 设置ApolloConfigService端口为:8081,ApolloAdminService端口为8091
    echo
    
    set url="localhost:3306"
    set username="root"
    set password="mysqlpwd"
    
    start "configService-PRO" java -Dserver.port=8081 -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://%url%/ApolloConfigDBPRO?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-configservice.log -jar .\apollo-configservice-1.3.0.jar
    start "adminService-PRO" java -Dserver.port=8091 -Xms256m -Xmx256m -Dapollo_profile=github -Dspring.datasource.url=jdbc:mysql://%url%/ApolloConfigDBPRO?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-adminservice.log -jar .\apollo-adminservice-1.3.0.jar
    
    1. 运行runApollo-PRO.bat

    5.4.4 修改Eureka地址

    更新生产环境Apollo的Eureka地址:

    USE ApolloConfigDBPRO;
    
    UPDATE ServerConfig SET `Value` = "http://localhost:8081/eureka/" WHERE `key` = "eureka.service.url";
    

    5.4.5 调整ApolloPortal服务配置

    服务配置项统一存储在ApolloPortalDB.ServerConfig表中,可以通过管理员工具 - 系统参数页面进行配置:apollo.portal.envs - 可支持的环境列表

    默认值是dev,如果portal需要管理多个环境的话,以逗号分隔即可(大小写不敏感),如:

    dev,pro
    

    5.4.6 启动ApolloPortal

    Apollo Portal需要在不同的环境访问不同的meta service(apollo-configservice)地址,所以我们需要在配置中提供这些信息。

    -Ddev_meta=http://localhost:8080/ -Dpro_meta=http://localhost:8081/
    
    1. 关闭之前启动的ApolloPortal服务,使用runApolloPortal.bat启动多环境配置
       echo
    
       set url="localhost:3306"
       set username="root"
       set password="123"
    
       start "ApolloPortal" java -Xms256m -Xmx256m -Dapollo_profile=github,auth -Ddev_meta=http://localhost:8080/ -Dpro_meta=http://localhost:8081/ -Dserver.port=8070 -Dspring.datasource.url=jdbc:mysql://%url%/ApolloPortalDB?characterEncoding=utf8 -Dspring.datasource.username=%username% -Dspring.datasource.password=%password% -Dlogging.file=.\logs\apollo-portal.log -jar .\apollo-portal-1.3.0.jar
    
    1. 启动之后,点击account-service服务配置后会提示环境缺失,此时需要补全上边新增生产环境的配置

    1. 点击补缺环境

    1. 补缺过生产环境后,切换到PRO环境后会提示有Namespace缺失,点击补缺

    1. 从dev环境同步配置到pro

    5.4.7 验证配置

    1. 同步完成后,切换到pro环境,修改生产环境rocketmq地址后发布配置

    配置项目使用pro环境,测试配置是否生效

     -Denv=pro -Dapollo.cacheDir=/opt/data/apollo-config -Dapollo.cluster=DEFAULT
    

    image-20190917175922694

    5.5 灰度发布

    5.5.1 定义

    ​ 灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。

    5.5.2 Apollo实现的功能

    1. 对于一些对程序有比较大影响的配置,可以先在一个或者多个实例生效,观察一段时间没问题后再全量发布配置。
    2. 对于一些需要调优的配置参数,可以通过灰度发布功能来实现A/B测试。可以在不同的机器上应用不同的配置,不断调整、测评一段时间后找出较优的配置再全量发布配置。

    5.5.3 场景介绍

    apollo-quickstart项目有两个客户端:

    1. 172.16.0.160
    2. 172.16.0.170

    灰度目标

    当前有一个配置timeout=2000,我们希望对172.16.0.160灰度发布timeout=3000,对172.16.0.170仍然是timeout=2000。

    5.5.4 创建灰度

    1. 点击application namespace右上角的创建灰度按钮

    image-20190917185518909

    1. 点击确定后,灰度版本就创建成功了,页面会自动切换到灰度版本Tab

    5.5.5 灰度配置

    1. 点击主版本的配置中,timeout配置最右侧的对此配置灰度按钮

    1. 在弹出框中填入要灰度的值:3000,点击提交

    5.5.6 配置灰度规则

    1. 切换到灰度规则Tab,点击新增规则按钮

    1. 在弹出框中灰度的IP下拉框会默认展示当前使用配置的机器列表,选择我们要灰度的IP,点击完成

    image-20190917190347229

    如果下拉框中没找到需要的IP,说明机器还没从Apollo取过配置,可以点击手动输入IP来输入,输入完后点击添加按钮

    image-20190917190517170

    5.5.7 灰度发布

    1. 启动apollo-quickstart项目的GrayTest类输出timeout的值

    vm options: -Dapp.id=apollo-quickstart -Denv=DEV -Ddev_meta=http://localhost:8080

       public class GrayTest {
    
       	// VM options:
       	// -Dapp.id=apollo-quickstart -Denv=DEV -Ddev_meta=http://localhost:8080
       	public static void main(String[] args) throws InterruptedException {
       		Config config = ConfigService.getAppConfig();
       		String someKey = "timeout";
    
       		while (true) {
       			String value = config.getProperty(someKey, null);
       			System.out.printf("now: %s, timeout: %s%n", LocalDateTime.now().toString(), value);
       			Thread.sleep(3000L);
       		}
       	}
       }
    

    1. 切换到配置Tab,再次检查灰度的配置部分,如果没有问题,点击灰度发布

    1. 在弹出框中可以看到主版本的值是2000,灰度版本即将发布的值是3000。填入其它信息后,点击发布

    1. 发布后,切换到灰度实例列表Tab,就能看到172.16.0.160已经使用了灰度发布的值

    5.5.8 全量发布

    如果灰度的配置测试下来比较理想,符合预期,那么就可以操作全量发布

    全量发布的效果是:

    1. 灰度版本的配置会合并回主版本,在这个例子中,就是主版本的timeout会被更新成3000
    2. 主版本的配置会自动进行一次发布
    3. 在全量发布页面,可以选择是否保留当前灰度版本,默认为不保留。

    image-20190918113019626

    image-20190918113037104

    5.5.9 放弃灰度

    如果灰度版本不理想或者不需要了,可以点击放弃灰度

    image-20190918103327131

    5.5.10 发布历史

    点击主版本的发布历史按钮,可以看到当前namespace的主版本以及灰度版本的发布历史

     

     

     

     

     

     

     

     

     

    展开全文
  • apollo

    2019-10-08 20:12:46
    1、 官方网站:http://activemq.apache.org/apollo/ 下载可执行文件的压缩包,解压到目录 2、 执行win+r,打开windows的命令行语句 ...执行${APOLLO_HOME}/bin/apollo create mybroker 其中${APOLLO...

    1、  官方网站:http://activemq.apache.org/apollo/

    下载可执行文件的压缩包,解压到目录

    2、  执行win+r,打开windows的命令行语句

    (1)先创建broker,broker相当于设置了一个指定的代理,消息传递在这个代理下运行

    执行${APOLLO_HOME}/bin/apollo create mybroker

    其中${APOLLO_HOME}是解压的文件路径,例如:D:\apache-apollo-1.7.1

    mybroker是所创建的broker名称,这个可以根据需要变换

     (2)找到创建的broker的路径,例如:D:\apache-apollo-1.7.1\bin\mybroker

           执行D:\apache-apollo-1.7.1\bin\mybroker\bin\apollo-broker run

           即可运行起来当前创建的broker

     (3)网络管理员

          Apollo提供了简单的网页管理方式

         具体的浏览路径是:http://127.0.0.1:61680/ 或者https://127.0.0.1:61681/

         默认的用户名和密码是: admin 和password.

    转载于:https://www.cnblogs.com/viagraHero/p/5947498.html

    展开全文
  • 配置中心-Apollo分布式部署指南

    万次阅读 2020-09-24 19:30:43
    参考官网链接:https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97 ...DEV环境:172.16.88.223 安装:apollo-admin 和 apollo-config PRO环境:172....

    有问题可联系本人QQ:1016401546

    参考官网链接:https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97

    注意:我的笔记是个简洁版的安装方式,没有官方文档那么繁琐,旨在成功安装和运行使用。

    一、准备工作

    1、 运行时环境

    机器:centos 7 两台

    DEV环境:172.16.88.223 安装:apollo-admin 和 apollo-config

    PRO环境:172.16.88.221 安装:apollo-admin 、apollo-config 和 apollo-portal

    Java版本:1.8

    我要部署的环境:开发环境(DEV)和生产环境(PRO)

    Apollo目前支持以下环境:

    • DEV
      • 开发环境
    • FAT
      • 测试环境,相当于alpha环境(功能测试)
    • UAT
      • 集成环境,相当于beta环境(回归测试)
    • PRO
      • 生产环境

    Portal部署在生产环境的机房,通过它来直接管理FAT、UAT、PRO等环境的配置

    • Meta Server、Config Service和Admin Service在每个环境都单独部署,使用独立的数据库
    • Meta Server、Config Service和Admin Service在生产环境部署在两个机房,实现双活
    • Meta Server和Config Service部署在同一个JVM进程内,Admin Service部署在同一台服务器的另一个JVM进程内

     

    2、安装MySQL

    2.1 我安装的是mysql 5.7 ,两台机器都要安装,因为不同的环境使用独立的MySQL。

    参考MySQL安装连接:https://blog.csdn.net/MYF12/article/details/78110419

    后者yum安装参考:https://www.cnblogs.com/wwjj4811/p/12793318.html

    2.2 导入Apollo数据

    二、部署步骤

    下载Apollo 安装包:(可去我主页搜索,有该资源)

    我是通过安装包直接解压安装的:

    下载链接:https://github.com/ctripcorp/apollo/releases

    mkdir /data/apollo -p
    wget https://github.com/ctripcorp/apollo/releases/download/v1.7.1/apollo-adminservice-1.7.1-github.zip
    wget https://github.com/ctripcorp/apollo/releases/download/v1.7.1/apollo-configservice-1.7.1-github.zip
    wget https://github.com/ctripcorp/apollo/releases/download/v1.7.1/apollo-portal-1.7.1-github.zip
    可能下载的很慢。

     

    1、部署PRO环境

    导入ApolloPortalDB数据

    SQL查看链接:https://github.com/ctripcorp/apollo/blob/master/scripts/sql/apolloportaldb.sql(把SQL复制下来即可)

    登录MySQL导入:source /tmp/apolloportaldb.sql(会自动创建数据库)

    导入成功后,可以通过执行以下sql语句来验证:

    select `Id`, `Key`, `Value`, `Comment` from `ApolloPortalDB`.`ServerConfig` limit 1;
    

      默认只有dev环境

    Id

    Key

    Value

    Comment

    1

    apollo.portal.envs

    dev

    可支持的环境列表

    注:ApolloPortalDB只需要在生产环境部署一个即可

     

     

    导入ApolloConfigDB数据

    SQL查看链接:https://github.com/ctripcorp/apollo/blob/master/scripts/sql/apolloconfigdb.sql

    登录MySQL导入:source /tmp/apolloconfigdb.sql(会自动创建数据库)

    导入成功后,可以通过执行以下sql语句来验证:

    select `Id`, `Key`, `Value`, `Comment` from `ApolloConfigDB`.`ServerConfig` limit 1;

    Id

    Key

    Value

    Comment

    1

    eureka.service.url

    http://127.0.0.1:8080/eureka/

    Eureka服务Url

    注:ApolloConfigDB需要在每个环境部署一套,如fat、uat和pro分别部署3套ApolloConfigDB

    这里填入该环境的eureka服务地址,如我pro环境地址是172.16.88.221,那么我把`ApolloConfigDB`.`ServerConfig`的value修改成172.16.88.221,如果端口号改了也要一起改

    update `ApolloConfigDB`.`ServerConfig` set `Value` = 'http://172.16.88.221:8080/eureka/' where `Key` = 'eureka.service.url';
    

    安装apollo-configservice

    cd /data/apollo 
    mkdir apollo-config
    mv apollo-configservice-1.7.1-github.zip  apollo-config
    cd apollo-config
    unizp apollo-configservice-1.7.1-github.zip
    vim config/application-github.properties
    # DataSource ,我用的是root,你可以创建一个其他用户,但前提有权限访问
    # 记得添加&serverTimezone=GMT,否则启动报错
    spring.datasource.url = jdbc:mysql://172.16.88.221:3306/ApolloConfigDB?characterEncoding=utf8&serverTimezone=GMT
    spring.datasource.username = root
    spring.datasource.password = 123456
    启动:./scripts/startup.sh
    停止:./scripts/shutdown.sh
    如果要修改其他端口可以,但是修改之后数据库的配配置也要修改:
    vim ./scripts/startup.sh
    SERVER_PORT=${SERVER_PORT:=8082}

    安装apollo-adminservice

    cd /data/apollo 
    mkdir apollo-admin
    mv pollo-adminservice-1.7.1-github.zip  apollo-admin
    unizp pollo-adminservice-1.7.1-github.zip
    vim config/application-github.properties 
    # DataSource ,我用的是root,你可以创建一个其他用户,但前提有权限访问
    spring.datasource.url = jdbc:mysql://172.16.88.221:3306/ApolloConfigDB?characterEncoding=utf8&serverTimezone=GMT
    spring.datasource.username = root
    spring.datasource.password = 123456
    启动:./scripts/startup.sh
    停止:./scripts/shutdown.sh
    如果要修改其他端口可以,但是修改之后数据库的配配置也要修改:
    vim ./scripts/startup.sh
    SERVER_PORT=${SERVER_PORT:=8090}

    安装apollo-portal

     

    portal相当于一个管理页面,就算重启也不会影响组件获取配置,因为组件获取配置链接的是对应环境的apollo configservice 端口获取的,所以portal只需要部署一个即可。portal部署到外网也可以,adminservice和configservice 一定要部署到内网。

    cd /data/apollo 
    mkdir apollo-portal
    mv pollo-portal-1.7.1-github.zip  apollo-portal
    unizp pollo-portal-1.7.1-github.zip
    vim config/application-github.properties 
    # DataSource ,我用的是root,你可以创建一个其他用户,但前提有权限访问
    spring.datasource.url = jdbc:mysql://172.16.88.223:3306/ApolloPortalDB?characterEncoding=utf8&serverTimezone=GMT
    spring.datasource.username = root
    spring.datasource.password = 123456
    启动:./scripts/startup.sh
    停止:./scripts/shutdown.sh
    如果要修改其他端口可以,但是修改之后数据库的配配置也要修改:
    vim ./scripts/startup.sh
    SERVER_PORT=${SERVER_PORT:=8070}

    全部启动之后,可以打开172.16.88.221:8070验证下是否正常登陆。

    账号密码:apollo/admin

     

     

    2、部署DEV环境

    方法和安装PRO一样,但只需要安装apollo-configservice 和 apollo-adminservice,数据库改成本机的数据库。

    安装完了之后启动 apollo config 和 apollo admin。

     

    三、配置

    需要修改的配置:

    apollo.portal.envs --环境列表

    apollo.portal.meta.servers  --环境地址

    organizations --部门

    登陆apollo portal页面

    http://172.16.88.221:8070

    右上角:【管理员工具】--【系统参数】

     

    输入:apollo.portal.envs ,点击查询

    apollo.portal.envs 默认是只有dev,我们修改为DEV,PRO(大小写不敏感),然后点击【保存】,就会覆盖原来的配置。

    上面说一分钟后自动生效,但是我的没有生效,是重启了portal才生效的。

     

     

    修改:apollo.portal.meta.servers 

    {
        "DEV":"http://172.16.88.223:8082",   因为我8080端口被占用了,所以改成了8082端口
        "PRO":"http://172.16.88.221:8082"
    }

    其他的配置参数可以参考官方文档的2.1.3.1节

    特别需要注意这个文件:apollo-portal/config/apollo-env.properties

    这个配置文件也是配置各环境的configservice地址的,但是 apollo.portal.meta.servers 优先级大于配置文件,也就是说如果apollo.portal.meta.servers 配置了会先使用apollo.portal.meta.servers 的。如果apollo.portal.meta.servers 没有则读取配置文件的

    上面配置完,重启portal之后,在 【管理员工具】 -- 【系统信息】 可以看到所有环境连接情况。

    如果你在apollo.portal.envs配置了其他的环境这里也会显示出来,我只配置了DEV和PRO

     

    修改:organizations 

     

    这个部门配置会出现在你新建项目的管理部门里面。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • apollo文档

    2018-03-06 16:12:13
    主要是apollo一些文档整理,github上都有的主要是apollo一些文档整理,github上都有的主要是apollo一些文档整理,github上都有的主要是apollo一些文档整理,github上都有的主要是apollo一些文档整理,github上都有的
  • <div><p>WARNING: npm peer requirements (for apollo) not installed: - apollo-client.5.26 installed, apollo-client@^1.0.0-rc.6 needed <p>Read more about installing npm peer dependencies: ...
  • Apollo 5.5 enhances the complex urban road autonomous driving capabilities of previous Apollo releases, by introducing curb-to-curb driving support. With this new addition, Apollo is now a leap closer...
  • Apollo.zip

    2020-04-24 21:42:30
    Apollo服务器端jar包 apollo-adminservice、apollo-configservice、apollo-portal
  • 阿波罗碎片 Apollo Fragment拥有旨在将UI组件连接到Apollo Cache中的GraphQL片段的库。 apollo-link-state-fragment公开了cacheRedirect和withClientState配置,用于从缓存中查询片段。 apollo-fragment-react公开...
  • React阿波罗 :warning_selector: 此项目已被弃用 :warning_selector: 请注意,4.0.0是所有React Apollo软件包的最终版本。 现在可以从@apollo/client > = 3直接获得React Apollo功能。虽然仍然可以使用@apollo/...
  • apollo-base:Apollo GraphQL服务器的基本模板
  • - [x] apollographql/apollo-client#5532 - [x] apollographql/apollo-client#5541 - [x] angular/angular#34560 <p>Migration from Apollo Angular 1.0 to 2.0 is a matter of one single command: <pre><code>$ ng...
  • Apollo代码学习(二)—车辆运动学模型

    万次阅读 多人点赞 2018-10-11 20:53:13
    Apollo代码学习—车辆运动学与动力学模型前言车辆模型车辆运动学模型车辆动力学模型 Apollo(阿波罗)是一个开放的、完整的、安全的自动驾驶平台,以灵活和高性能的技术架构,为全自动驾驶提供支持。 前言 要...

    Apollo(阿波罗)是一个开放的、完整的、安全的自动驾驶平台,以灵活和高性能的技术架构,为全自动驾驶提供支持。

    前言

    要实现对车辆的控制,研究其运动学模型和动力学模型必不可少。上文对横纵向控制的构成及实现做了概述,本文将从车辆的运动学和动力学模型入手,研究如何控制车辆,以及为什么这样控制车辆。

    本文的观点及图表多基于下述书籍及链接,并结合Apollo代码整理而来,由于本身并没有学过实车相关的知识,对力学的认知也不够深,如有理解偏颇或侵权之处,请指正删改。
    【1】Rajamani R. Vehicle Dynamics and Control[M]. Springer Science, 2006.
    【2】龚建伟, 姜岩, 徐威. 无人驾驶车辆模型预测控制[M]. 北京理工大学出版社, 2014.
    【3】无人驾驶汽车系统入门(五)——运动学自行车模型和动力学自行车模型

    提倡大家支持正版资源,本人提供文档仅限交流学习使用,侵删:
    【1】Rajamani R. Vehicle Dynamics and Control[M]. Springer Science, 2006. | CSDN资源
    【2】龚建伟, 姜岩, 徐威. 无人驾驶车辆模型预测控制[M]. 北京理工大学出版社, 2014. | CSDN资源

    车辆模型

    车辆运动学模型与动力学模型的建立是出于车辆运动的规划与控制考虑的。自动驾驶场景下,车辆大多按照规划轨迹行驶,控制模块的作用就是控制车辆尽可能精准的按照规划轨迹行驶。这就要求规划轨迹尽可能贴近实际情况,也就是说,轨迹规划过程中应尽可能考虑车辆运动学及动力学约束,使得运动跟踪控制的性能更好。

    搭建车辆模型主要是为了更好的规划和控制,因此,在分析模型时尽量以应用时所需的输入、输出对对象进行建模分析。Apollo中,计算控制命令需要车辆的定位信息、底盘信息以及规划信息等,

    Status xxxController::ComputeControlCommand(
        const localization::LocalizationEstimate *localization, //定位信息
        const canbus::Chassis *chassis,  //底盘信息
        const planning::ADCTrajectory *planning_published_trajectory, //规划信息
        ControlCommand *cmd //控制命令)
    

    其中,
    定位信息(localization.proto)包含

    message LocalizationEstimate {
      optional apollo.common.Header header = 1;
      optional apollo.localization.Pose pose = 2;
      optional Uncertainty uncertainty = 3;
    
      // The time of pose measurement, seconds since the GPS epoch (Jan 6, 1980).
      optional double measurement_time = 4;  // In seconds.
    
      // Future trajectory acturally driven by the drivers
      repeated apollo.common.TrajectoryPoint trajectory_point = 5;
    }
    

    底盘信息(chassis.proto)包含

    message Chassis {
      enum DrivingMode {
        COMPLETE_MANUAL = 0;  // human drive
        COMPLETE_AUTO_DRIVE = 1;
        AUTO_STEER_ONLY = 2;  // only steer
        AUTO_SPEED_ONLY = 3;  // include throttle and brake
    
        // security mode when manual intervention happens, only response status
        EMERGENCY_MODE = 4;
      }
      
      ...
    
      // Only available for Lincoln now
      optional ChassisGPS chassis_gps = 28;
    
      optional apollo.common.EngageAdvice engage_advice = 29;
    }
    

    规划信息(planning.proto)包含

    message ADCTrajectoryPoint {
      optional double x = 1;  // in meters.
      optional double y = 2;  // in meters.
      optional double z = 3;  // height in meters.
    
      optional double speed = 6;  // speed, in meters / second
      optional double acceleration_s = 7;  // acceleration in s direction
      optional double curvature = 8;  // curvature (k = 1/r), unit: (1/meters)
      // change of curvature in unit s (dk/ds)
      optional double curvature_change_rate = 9;
      // in seconds (relative_time = time_of_this_state - timestamp_in_header)
      optional double relative_time = 10;
      optional double theta = 11;  // relative to absolute coordinate system
      // calculated from the first point in this trajectory
      optional double accumulated_s = 12;
    
      // in meters, reference to route SL-coordinate
      optional double s = 4 [deprecated = true];
      // in meters, reference to route SL-coordinate
      optional double l = 5 [deprecated = true];
    }
    

    对上述元素进行精简,我们需要关注的信息主要有:

    1. 时间(tt
    2. 位置(x,yx, y
    3. 速度(vv
    4. 加速度(aa
    5. 角速度(ω\omega
    6. 位移(ss
    7. 航向角(ψ\psi
    8. 曲率(kk
    9. 前轮转角(wheelwheel
    10. 方向盘转角(steersteer
    11. 刹车(brakebrake
    12. 油门(throttlethrottle
    13. 档位(geargear

    其中,

    • 方向盘转角(steersteer
    • 刹车(brakebrake
    • 油门(throttlethrottle
    • 档位(geargear

    为主要被控量。

    单车模型(Bicycle Model)

    建立模型时,应尽可能使模型简单易用,且能真实反映车辆特性,搭建车辆模型多基于(Bicycle Model)\color{Maroon}单车模型(Bicycle\ Model),使用单车模型需做如下假设[^1]:

    1. 不考虑车辆在Z轴方向的运动,只考虑XY水平面的运动,如图1所示;
    2. 左右侧车轮转角一致,这样可将左右侧轮胎合并为一个轮胎,以便于搭建单车模型,如图2所示;
    3. 车辆行驶速度变化缓慢,忽略前后轴载荷的转移;
    4. 车身及悬架系统是刚性的。
    图1 车辆模型

    (Bicycle Model)\color{Maroon}单车模型(Bicycle\ Model)将左/右前轮合并为一个点,位于A点;将左/右后轮合并为一个点,位于B点;点C为车辆质心点。

    图2 单车模型

    其中,OO为OA、OB的交点,是车辆的瞬时滚动中心,线段OA、OB分别垂直于两个滚动轮的方向;β\beta滑移角(Tire Slip Angle),指车辆速度方向和车身朝向两者间所成的角度,ψ\psi航向角(Heading Angle),指车身与X轴的夹角。

    关于滑移角和航向角,此处有较大争议,由于此处是翻译而来的,而我不能给大家准确的信息,因此附上原文,望大家自己甄别:
    原文出处:Vehicle Dynamics and Control. p20
    ( X , Y ) are inertial coordinates of the location of the vehicle while ψ\psi describes the orientation of the vehicle. The velocity of the vehicle is denoted by VV and makes an angle β\beta with the longitudinal axis of the vehicle. The angle β\beta is called the slip angle of the vehicle.
    如若有确切出处可以证明我所书写的有错,感谢指正并附上出处,感激不尽。

    符号 定义 符号 定义
    AA 前轮中心 BB 后轮中心
    CC 车辆质心 OO 转向圆心
    VV 质心车速 RR 转向半径
    r\ell_r 后悬长度 f\ell_f 前悬长度
    β\beta 滑移角 ψ\psi 航向角
    δr\delta_r 后轮偏角 δf\delta_f 前轮偏角

    当车辆为(frontwheelonly)\color{Maroon}前轮驱动(front-wheel-only)时,可假设δr\delta_r恒为0。

    车辆运动学模型

    运动学是从几何学的角度研究物体的运动规律,包括物体在空间的位置、速度等随时间而产生的变化,因此,车辆运动学模型应该能反映车辆位置、速度、加速度等与时间的关系。在车辆轨迹规划过程中应用运动学模型,可以使规划出的轨迹更切合实际,满足行驶过程中的运动学几何约束,且基于运动学模型设计出的控制器也能具有更可靠的控制性能。

    基于单车模型,如图2所示,搭建车辆运动学模型。由正弦法则:
    sin(δfβ)f=sin(π2δf)R(1.1)\frac{\sin(\delta_f-\beta)}{\ell_f}=\frac{\sin(\frac{\pi}{2}-\delta_f)}{R} \tag{1.1}
    sin(βδr)r=sin(π2+δr)R(1.2)\frac{\sin(\beta-\delta_r)}{\ell_r}=\frac{\sin(\frac{\pi}{2}+\delta_r)}{R} \tag{1.2}
    展开公式(1.1)(1.2)(1.1)(1.2)可得:
    sinδfcosβsinβcosδff=cosδfR(1.3)\frac{\sin\delta_f\cos\beta-\sin\beta\cos\delta_f}{\ell_f}=\frac{\cos\delta_f}{R} \tag{1.3}
    cosδrsinβcosβsinδrr=cosδrR(1.4)\frac{\cos\delta_r\sin\beta-\cos\beta\sin\delta_r}{\ell_r}=\frac{\cos\delta_r}{R} \tag{1.4}
    联立公式(1.3)(1.4)(1.3)(1.4)可得:
    (tanδftanδr)cosβ=f+rR(1.5)(\tan\delta_f-\tan\delta_r)\cos\beta=\frac{\ell_f+\ell_r}{R} \tag{1.5}

    低速环境下,车辆行驶路径的转弯半径变化缓慢,此时我们可以假设车辆的方向变化率等于车辆的角速度。则车辆的角速度为ψ˙=VR(1.6)\dot{\psi}=\frac{V}{R} \tag{1.6}
    联立公式(1.5)(1.6)(1.5)(1.6)可得:
    ψ˙=Vcosβf+r(tanδftanδr)(1.7)\dot{\psi}=\frac{V\cos\beta}{\ell_f+\ell_r}(\tan\delta_f-\tan\delta_r) \tag{1.7}
    则在惯性坐标系XY下,可得车辆运动学模型:

    {X˙=Vcos(ψ+β)Y˙=Vsin(ψ+β)ψ˙=Vcosβf+r(tanδftanδr)(1.8)\begin{cases} \dot{X}=V\cos(\psi+\beta) \\ \dot{Y}=V\sin(\psi+\beta) \\ \dot{\psi}=\frac{V\cos\beta}{\ell_f+\ell_r}(\tan\delta_f-\tan\delta_r) \tag{1.8} \end{cases}

    此模型中有三个输入:δf\delta_fδr\delta_rVV
    滑移角β\beta可由公式(1.3)(1.4)(1.3)(1.4)求得:
    β=tan1(ftanδr+rtanδff+r)(1.9)\beta=\tan^{-1}(\frac{\ell_f\tan\delta_r+\ell_r\tan\delta_f}{\ell_f+\ell_r}) \tag{1.9}

    阿克曼转向几何(Ackerman turning geometry)

    (Ackerman Turning Geometry)\color{Red}阿克曼转向几何(Ackerman\ Turning\ Geometry)是一种为了解决交通工具转弯时,内外转向轮路径指向的圆心不同的几何学。

    在单车模型中,将转向时左/右前轮偏角假设为同一角度,虽然通常两个角度大致相等,但实际并不是,通常情况下,内侧轮胎转角更大。如下图所示,δo\delta_oδi\delta_i分别为外侧前轮和内侧前轮偏角,当车辆右转时,右前轮胎为内侧轮胎,其转角δi\delta_i较左前轮胎转角δo\delta_o更大。w\ell_w为轮距,LL为轴距,后轮两轮胎转角始终为0°\color{Maroon}0\degree
    当以后轴中心为参考点时,转向半径RR为下图中线\color{Red}红线

    图3 阿克曼转向几何

    当滑移角β\beta很小时,且后轮偏角为0时,公式(1.7)(1.7)可表述为:
    ψ˙V1R=δL(1.10)\frac{\dot{\psi}}{V}\approx\frac{1}{R}=\frac{\delta}{L} \tag{1.10}
    由于内外侧轮胎的转向半径不同,因此有:
    δo=LR+w2(1.11)\delta_o=\frac{L}{R+\frac{\ell_w}{2}} \tag{1.11}
    δi=LRw2(1.12)\delta_i=\frac{L}{R-\frac{\ell_w}{2}} \tag{1.12}
    则前轮平均转角
    δ=δo+δi2LR(1.13)\delta=\frac{\delta_o+\delta_i}{2}\cong\frac{L}{R}\tag{1.13}
    内外转角之差
    Δδ=δiδo=LR2w=δ2wL(1.14)\Delta\delta=\delta_i-\delta_o=\frac{L}{R^2}\ell_w=\delta^2\frac{\ell_w}{L} \tag{1.14}
    因此,两个前轮的转向角的差异Δδ\Delta\delta与平均转向角δ\delta的平方成正比。

    依据阿克曼转向几何设计的车辆,沿着弯道转弯时,利用四连杆的相等曲柄使内侧轮的转向角比外侧轮大大约2~4度,使四个轮子路径的圆心大致上交会于后轴的延长线上瞬时转向中心,让车辆可以顺畅的转弯。

    图4 梯形拉杆装置差动转向机构

    小结

    以后轴中心为参考点,以单车模型为基础建立车辆的运动学模型,(Xr,Yr)(X_r, Y_r)为后轴中心坐标,ψ\psi为航向角,vrv_r为车速,δf\delta_f为前轮转角,后轮转角δr\delta_r恒为0°0\degreeww为横摆角速度,滑移角β\beta极小,假设为0。

    当状态量为ξ=[Xr,Yr,ψ]T\xi=[X_r, Y_r, \psi]^T,被控量为u=[vr,δf]Tu=[v_r, \delta_f]^T时,公式(1.8)(1.8)可转换为如下形式:
    [Xr˙Yr˙ψ˙]=[cosψsinψtanδf/l]vr(1.15) \begin{bmatrix} \dot{X_r} \\ \dot{Y_r} \\ \dot\psi \end{bmatrix}= \begin{bmatrix} \cos\psi \\ \sin\psi \\ \tan{\delta_f}/l \end{bmatrix}v_r \tag{1.15}
    但在无人车控制过程中,一般控制对象u=[vr,w]Tu=[v_r, w]^T,则式1.15可写为:
    [Xr˙Yr˙ψ˙]=[cosψsinψ0]vr+[001]w(1.16) \begin{bmatrix} \dot{X_r} \\ \dot{Y_r} \\ \dot\psi \end{bmatrix}= \begin{bmatrix} \cos\psi \\ \sin\psi \\ 0 \end{bmatrix}v_r+ \begin{bmatrix} 0\\ 0 \\ 1 \end{bmatrix}w \tag{1.16}
    速度vrv_r的控制主要通过刹车(brakebrake)、油门(throttlethrottle)、档位(geargear)等来控制,横摆角速度ww主要通过转动方向盘(steersteer)来控制。

    Apollo中的运动学约束(control_gflags.cc)主要有:

    DEFINE_int32(max_localization_miss_num, 20,
                 "Max missing number of localization before entering estop mode");
    DEFINE_int32(max_chassis_miss_num, 20,
                 "Max missing number of chassis before entering estop mode");
    DEFINE_int32(max_planning_miss_num, 20,
                 "Max missing number of planning before entering estop mode");
    
    DEFINE_double(max_acceleration_when_stopped, 0.01,
                  "max acceleration can be observed when vehicle is stopped");
    DEFINE_double(max_abs_speed_when_stopped, 0.01,
                  "max absolute speed can be observed when vehicle is stopped");
    DEFINE_double(steer_angle_rate, 100.0,
                  "Steer angle change rate in percentage.");
    

    车辆动力学模型请看下一篇博文:Apollo代码学习(三)—车辆动力学模型

    展开全文
  • apollo学习

    2021-03-08 16:35:19
    1.apollo 1.apollo的安装!!!:是学习apollo的网站,虽然安装教程麻烦但是更好一些。 2.apollo的理解图 2.springboot整合apollo 1.必须导入的依赖包 apollo-client-1.3.0.jar apollo-core-1.3.0.jar guice-...
  • apollo报错

    2021-04-01 22:46:25
    apollo整合报错原因 pom的版本不对 com.ctrip.framework.apollo apollo-client 1.3.0 可以通过对比旧版本 修改同类参数
  • Apollo-Gql-Practise:Apollo-Gql-Practise
  • 更多内容在:apollo系列汇总 Apollo2 mcu的架构
  • apche-apollo

    2017-12-11 15:11:34
    mqtt 代理服务器apollo, mqtt 代理服务器apollo, mqtt 代理服务器apollo,。
  • Apollo入门

    2020-06-27 13:31:49
    Apollo入门 公司项目使用了Apollo配置中心,找了个入门视频学习一下。只是一些基本的操作,架构有待深入研究。内容包括: Apollo的工作流程 Apollo的4个维度管理Key-Value格式的配置:application (应用)、...
  • Apollo安装

    2020-11-29 21:45:48
    安装Apollo 运行环境 java 1.8+ MySQL 5.6.5+ 下载配置 1.访问Apollo官方主页获取安装包(选择最新版v1.7.1) https://github.com/ctripcorp/apollo/tags 2.打开1.7.1的发布链接,下载下图标记的安装包 图中的.sha...
  • apollo-configservice_apollo-configdev.log a sdasdasda
  • apollo部署

    千次阅读 2019-09-26 08:12:31
    apollo部署 1.下载工程包 进入apollo仓库[https://github.com/ctripcorp/apollo.git]下载最新版本代码; apollo-adminservice-1.4.0-github.zip apollo-configservice-1.4.0-github.zip apollo-portal-1.4.0-github....
  • Apollo实操

    2020-08-12 16:28:06
    基于Apollo开发套件 Apollo硬件连接集成 Apollo推荐硬件平台以及车辆认证平台 Apollo硬件开发平台有相关参考硬件信息 Apollo开发套件硬件组成及原理 组成 车辆底盘 计算单元 实时传感器数据采集 计算处理 ...
  • apollo-tracing-elixir:苦艾酒的Apollo跟踪中间件

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,272
精华内容 7,708
热门标签
关键字:

apollo