docker安装apollo并接入若依框架
上一个项目中使用了携程的Apollo框架,就比较感兴趣,然后捣腾着学习了一下安装使用。
拉取镜像
我这边是用docker安装的,在本地机子上,然后映射到公网上,为了本地机环境干净点,选择了docker安装;
首先查看一下docker的镜像:
docker search apollo
没有选择apollo-quick-start,拉取了apollo-configservice,apollo-adminservice,apollo-portal:
docker pull apolloconfig/apollo-configservice:latest
docker pull apolloconfig/apollo-adminservice:latest
docker pull apolloconfig/apollo-portal:latest
初始化数据库
我用的本地docker安装的mysql,这里直接运行sql文件,我之前也是在博客上查资料,在一个帖子那里拿的github链接,结果里面的可能是过时了,最后运行时少了表,ApolloPortalDB的SPRING_SESSION表不存在,不知道还有其他缺失没。。。
运行sql
文件地址:https://github.com/apolloconfig/apollo/blob/master/scripts/sql/src/
这里我多建了一个ApolloConfigDB_pro,用来建造第二个环境pro,直接把ApolloConfigDB整个copy过来就行了;
修改ApolloConfigDB配置
这里注意一下,ApolloConfigDB和ApolloConfigDB_pro分别运行了dev和pro环境,所以里面的ServerConfig表要改一下,
这里apollo每个环境都要有自己的ApolloConfigDB库,以及apollo-configservice和apollo-adminservice,apollo-portal是共用的;所以两个ServerConfig表中标记的字段要换成所在环境最终部署的apollo-configservice服务的ip:port上,我把这两个环境都放在同一台机子上,只是端口一个7080一个7081;
运行容器
容器运行有先后顺序的,apollo-configservice>apollo-adminservice>apollo-portal;
这里之前已经拉取了镜像:
下面启动apollo-configservice:
docker run -d //后台运行
--restart=always //总是启动
--name apollo-configservice //容器名
-p 7080:8080 //宿主机端口:容器端口
-e SPRING_DATASOURCE_URL="jdbc:mysql://mysql:3306/ApolloConfigDB?characterEncoding=utf8" //链接的数据库链接,其中这里由于是局域网,为了防止ip跳动,使用--link mysql链接容器数据库,mysql是我的数据库容器名
-e SPRING_DATASOURCE_USERNAME=root //数据库用户
-e SPRING_DATASOURCE_PASSWORD=123456 //数据库密码
-v /usr/local/apollo/apolloConfigservice/logs:/opt/logs //将容器日志挂载到宿主机,方便查看日志排除问题
--link mysql //链接数据库容器
apolloconfig/apollo-configservice:latest //使用的镜像
docker run -d //后台运行
--restart=always //总是启动
--name apollo-configservice //容器名
-p 7080:8080 //宿主机端口:容器端口
-e SPRING_DATASOURCE_URL="jdbc:mysql://mysql:3306/ApolloConfigDB?characterEncoding=utf8" //链接的数据库链接,其中这里由于是局域网,为了防止ip跳动,使用--link mysql链接容器数据库,mysql是我的数据库容器名
-e SPRING_DATASOURCE_USERNAME=root //数据库用户
-e SPRING_DATASOURCE_PASSWORD=123456 //数据库密码
-v /usr/local/apollo/apolloConfigservice/logs:/opt/logs //将容器日志挂载到宿主机,方便查看日志排除问题
--link mysql //链接数据库容器
apolloconfig/apollo-configservice:latest //使用的镜像
启动apollo-configservice-pro:
docker run -d
--restart=always
--name apollo-configservice-pro
-p 7081:8080
-e SPRING_DATASOURCE_URL="jdbc:mysql://mysql:3306/ApolloConfigDB_pro?characterEncoding=utf8"
-e SPRING_DATASOURCE_USERNAME=root
-e SPRING_DATASOURCE_PASSWORD=123456
-v /usr/local/apollo/apolloConfigservice_pro/logs:/opt/logs
--link mysql
apolloconfig/apollo-configservice:latest
docker run -d
--restart=always
--name apollo-configservice-pro
-p 7081:8080
-e SPRING_DATASOURCE_URL="jdbc:mysql://mysql:3306/ApolloConfigDB_pro?characterEncoding=utf8"
-e SPRING_DATASOURCE_USERNAME=root
-e SPRING_DATASOURCE_PASSWORD=123456
-v /usr/local/apollo/apolloConfigservice_pro/logs:/opt/logs
--link mysql
apolloconfig/apollo-configservice:latest
启动apollo-adminservice:
docker run -d
--restart=always
--name apollo-adminservice
-p 7090:8090
-e SPRING_DATASOURCE_URL="jdbc:mysql://mysql:3306/ApolloConfigDB?characterEncoding=utf8"
-e SPRING_DATASOURCE_USERNAME=root
-e SPRING_DATASOURCE_PASSWORD=123456
-v /usr/local/apollo/apolloAdminservice/logs:/opt/logs
--link mysql
apolloconfig/apollo-adminservice:latest
docker run -d
--restart=always
--name apollo-adminservice
-p 7090:8090
-e SPRING_DATASOURCE_URL="jdbc:mysql://mysql:3306/ApolloConfigDB?characterEncoding=utf8"
-e SPRING_DATASOURCE_USERNAME=root
-e SPRING_DATASOURCE_PASSWORD=123456
-v /usr/local/apollo/apolloAdminservice/logs:/opt/logs
--link mysql
apolloconfig/apollo-adminservice:latest
启动apollo-adminservice-pro:
docker run -d
--restart=always
--name apollo-adminservice-pro
-p 7091:8090
-e SPRING_DATASOURCE_URL="jdbc:mysql://mysql:3306/ApolloConfigDB_pro?characterEncoding=utf8"
-e SPRING_DATASOURCE_USERNAME=root
-e SPRING_DATASOURCE_PASSWORD=123456
-v /usr/local/apollo/apolloAdminservice_pro/logs:/opt/logs
--link mysql
apolloconfig/apollo-adminservice:latest
docker run -d
--restart=always
--name apollo-adminservice-pro
-p 7091:8090
-e SPRING_DATASOURCE_URL="jdbc:mysql://mysql:3306/ApolloConfigDB_pro?characterEncoding=utf8"
-e SPRING_DATASOURCE_USERNAME=root
-e SPRING_DATASOURCE_PASSWORD=123456
-v /usr/local/apollo/apolloAdminservice_pro/logs:/opt/logs
--link mysql
apolloconfig/apollo-adminservice:latest
启动apollo-portal:
docker run -d
--restart=always
--name apollo-portal
-p 7070:8070
-e SPRING_DATASOURCE_URL="jdbc:mysql://mysql:3306/ApolloPortalDB?characterEncoding=utf8"
-e SPRING_DATASOURCE_USERNAME=root
-e SPRING_DATASOURCE_PASSWORD=123456
-e APOLLO_PORTAL_ENVS=dev,pro //有俩环境,所以这里给配了,用逗号分隔开
-e DEV_META=http://xx.xx.xx.xx:7080 //这个是apollo-configservice的地址,我本地机没固定ip,直接使用映射到公网的地址端口
-e PRO_META=http://xx.xx.xx.xx:7081 //这个是apollo-configservice-pro的地址,我本地机没固定ip,直接使用映射到公网的地址端口
-v /usr/local/apollo/apolloPortal/logs:/opt/logs
--link mysql
apolloconfig/apollo-portal:latest
docker run -d
--restart=always
--name apollo-portal
-p 7070:8070
-e SPRING_DATASOURCE_URL="jdbc:mysql://mysql:3306/ApolloPortalDB?characterEncoding=utf8"
-e SPRING_DATASOURCE_USERNAME=root
-e SPRING_DATASOURCE_PASSWORD=123456
-e APOLLO_PORTAL_ENVS=dev,pro //有俩环境,所以这里给配了,用逗号分隔开
-e DEV_META=http://xx.xx.xx.xx:7080 //这个是apollo-configservice的地址,我本地机没固定ip,直接使用映射到公网的地址端口
-e PRO_META=http://xx.xx.xx.xx:7081 //这个是apollo-configservice-pro的地址,我本地机没固定ip,直接使用映射到公网的地址端口
-v /usr/local/apollo/apolloPortal/logs:/opt/logs
--link mysql
apolloconfig/apollo-portal:latest
好了,都启动完了。
登录界面操作
登录
接下来就可以在页面上展示了,我的portal服务用了7070端口,直接打开:
默认账密是:apollo/admin,登陆进去:
建用户
我新建了一个用户:右上角的管理员工具>用户管理:
添加部门
管理员工具>系统参数
key里输入organizations,点查询:
里面只有样例部门1和样例部门2,我加了一个开发部门;
添加环境
管理员工具>系统参数,输入key:apollo.portal.envs,点查询:
这里应该只有一个dev,在后面加上pro,或者直接在数据库里加也行,
接下来退出登录,用刚建的新账号登录去创建项目吧。
创建项目
点击左边的创建应用,进入界面:
我使用的若依项目,所以,AppId选了刚建的部门DEVELOP,AppId写ruoyi,应用名称写ruoyi-server,应用负责人就当前用户,然后提交,首页就多了一个ruoyi项目;
点进去,点击左侧的添加namespace,
我创建了一个application-druid的命名空间,相当于我们项目中的application-druid.yml文件;
接下来就是导入配置了,若依项目使用的yml,我在网上找了一个yml转properties的站点,直接转换后就copy到了命名空间里:https://www.toyaml.com/index.html
好了,配置已经导入了Apollo,dev和pro都导了,可以先导入一个环境,然后使用同步配置功能同步过去:
记得完了之后要发布,不然没效果的。
修改项目使引入apollo
引入依赖
首先在ruoyi-admin的pom文件中引入依赖
<!--apollo配置-->
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.3.0</version>
</dependency>
<!--apollo配置-->
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.3.0</version>
</dependency>
添加注解
在启动类上添加注解@EnableApolloConfig
改配置文件
首先把application.yml和application-druid.yml全部注释,然后在application.yml中写入:
app:
id: ruoyi #在配置中心配置的应用身份信息(apollo中创建的)
apollo:
bootstrap:
namespaces: application,DEVELOP.application-druid # 配置的命名空间,多个逗号分隔,一个namespace相当于一个配置文件
enabled: true #在应用启动阶段是否向Spring容器注入被托管的properties文件配置信息
connectTimeout: 50000
readTimeout: 100000
eagerLoad:
enabled: true #将Apollo配置加载提到初始化日志系统之前
app:
id: ruoyi #在配置中心配置的应用身份信息(apollo中创建的,暂时咱们还没创建)
apollo:
bootstrap:
namespaces: application,DEVELOP.application-druid # 配置的命名空间,多个逗号分隔,一个namespace相当于一个配置文件
enabled: true #在应用启动阶段是否向Spring容器注入被托管的properties文件配置信息
connectTimeout: 50000
readTimeout: 100000
eagerLoad:
enabled: true #将Apollo配置加载提到初始化日志系统之前
我把这两个超时时间都加大了10倍,因为一开始我连的aliyun的数据库,性能实在不行后换了本地数据库了;
注意命名空间,我在新建application-druid时自动添加部门前缀那里是勾上的,所以此处要加上部门前缀DEVELOP;
添加启动参数
此处把你的环境和该环境所在apollo-configservice的地址加进去,后面如果部署到服务器,可以在dockerfile中把这两个参数加进去;
测试环境就把那个pro的配置进去,引入pro环境配置;
切记,jdk版本不要太高,我本地和服务器都是java17,跑起来老是报Unable to initialize Apollo Spring Injector!或者Unable to load cache item其他的错误!最后没办法全部装了jdk1.8,其他版本我也不知道;
到此处基本就接入成功了!