apollo部署和nginx代理问题解决

我正在参加「金石计划5.0」

一、写在前面

今天我们来学习一个分布式环境下,配置管理中心。

很多小伙伴可能会说:呵呵,用nacos不是挺好?

哈哈,我只能说:nacos确实是挺好的,而且还包含了注册中心的功能。不过哥们也是没有办法呀,甲方要求用apollo,我们确实只能去学习下apollo相关的知识点和使用方法了。

唉,又是掌握新技能的一天!!!

二、apollo介绍

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

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

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

  • apollo架构说明

JVM8080:对外暴露的网络端口是8080,里面有Meta Server,Eureka,Config Service,其中Config Service又使用了ConfigDB

JVM8090:对外暴露的网络端口是8090,里面有Admin Service,并且Admin Service使用了ConfigDB

JVM8070:对外暴露的网络端口是8070,里面有Portal,并且Portal使用了PortalDB

进程JVM8070依赖进程JVM8090和PortalDB

进程JVM8090依赖进程JVM8080和ConfigDB

进程JVM8080依赖ConfigDB

这里说明一下,apollo单机部署,最少需要2个database:1个PortalDB和ConfigDB

3个jvm进程:8070portal,8080configService,8090adminService

其中,8070portal,是web端配置中心管理端,也是我们经常使用到的。

这里为什么要先说明一下apollo架构呢,因为我们通过apollo的部署文档,直接跑起apollo服务。

一下子,直接跑起3个jvm进程,可能有些小伙伴,一时之间会有点迷惑,为啥有那么服务,我要用到哪个服务?能不能只跑起我需要的服务?

通过这个apollo架构图,可以知道,这3个jvm进程之间是由相互联系的,所以不能单单跑起某个服务,是需要所有的jvm服务都要跑起来,才行!!!

唉,看到这里,确实是有槽点了,3个jvm进程,消耗服务器资源不是更多了?

三、apollo单机部署

apollo文档说明

  • 环境准备

jdk环境:1.8+

mysql数据库:5.6.5+

  • apollo下载

直接下载Quick Start安装包,就可以直接使用,免去了编译、打包过程。

apollo-build-scripts项目

apollo-quick-start目录结构如上,一般我们要注意的有下面两个地方:

1.sql,是数据库脚本(创建数据库时用到)

2.demo.sh,是运行apollo的脚本(启动apollo时用到)

  • 创建数据库

Apollo服务端共需要两个数据库:ApolloPortalDBApolloConfigDB,我们把数据库、表的创建和样例数据都分别准备了sql(上面提到)文件,只需要导入数据库即可。

注意:如果你本地已经创建过Apollo数据库,请注意备份数据。这里的sql文件会清空Apollo相关的表。

并执行sql文件,初始化数据库

  • 配置数据库连接信息

Apollo服务端需要知道如何连接到你前面创建的数据库,所以需要编辑demo.sh(上面提到),修改ApolloPortalDB和ApolloConfigDB相关的数据库连接串信息。

注意:填入的用户需要具备对ApolloPortalDB和ApolloConfigDB数据的读写权限。

sh 复制代码
vi demo.sh

修改数据库连接配置

ini 复制代码
#apollo config db info
apollo_config_db_url="jdbc:mysql://localhost:3306/ApolloConfigDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai"
apollo_config_db_username=root
apollo_config_db_password=root

# apollo portal db info
apollo_portal_db_url="jdbc:mysql://localhost:3306/ApolloPortalDB?characterEncoding=utf8&serverTimezone=Asia/Shanghai"
apollo_portal_db_username=root
apollo_portal_db_password=root

注意:不要修改demo.sh的其它部分

  • 启动Apollo配置中心

Quick Start脚本会在本地启动3个服务,分别使用8070, 8080, 8090端口,请确保这3个端口当前没有被使用。

例如,在Linux/Mac下,可以通过如下命令检查:

sh 复制代码
lsof -i:8080 

启动apollo

bash 复制代码
./demo.sh start

当看到如下输出后,就说明启动成功了!

swift 复制代码
==== starting service ====
Service logging file is ./service/apollo-service.log
Application is running as root (UID 0). This is considered insecure.
Started [12798]
Waiting for config service startup....
Config service started. You may visit http://localhost:8080 for service status now!
Waiting for admin service startup.
Admin service started
==== starting portal ====
Portal logging file is ./portal/apollo-portal.log
Application is running as root (UID 0). This is considered insecure.
Started [13379]
Waiting for portal startup....
Portal started. You can visit http://localhost:8070 now!

访问:http://localhost:8070

输入用户名apollo,密码admin后登录

三、nginx代理apollo

因为apollo,8070端口的服务,是占用了/根目录访问的,那么我们用nginx代理,/根目录,一般是不会给这些中间件使用的。

所以我们要给apollo加上一个访问前缀。

直接nginx加前缀试试:

nginx 复制代码
location /apollo/ {
    proxy_pass http://127.0.0.1:8070/;
}

直接访问,有些请求,是会丢失了/apollo前缀,所以还不能简单的通过nginx加访问前缀

nginx访问的,登录完成后,是页面异常。就是有些接口丢失了/apollo

出现了这种情况,哥们一度以为要去改源码了,但是经过网上的一些资料,我们可以给apollo一个访问前缀。

嘿,看到这里,好像有种茅舍顿开的感觉,springboot项目,加访问前缀,不是简简单单的事吗?

sh 复制代码
-Dserver.servlet.context-path=/apollo

编辑一下demo.sh文件,在下面这个地方加上这个前缀即可。

重启apollo服务

加了前缀后,nginx就正常了

登录后,也正常


好了,以上就是我个人的实操了。可能有些不对,大家伙,轻点喷!!!

个人理解,可能也不够全面,班门弄斧了。

好了,今天就先到这里了!!!^_^

如果觉得有收获的,帮忙点赞、评论、收藏一下,再走呗!!!

相关推荐
弗拉唐24 分钟前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
2401_857610031 小时前
SpringBoot社团管理:安全与维护
spring boot·后端·安全
凌冰_2 小时前
IDEA2023 SpringBoot整合MyBatis(三)
spring boot·后端·mybatis
码农飞飞2 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货2 小时前
Rust 的简介
开发语言·后端·rust
monkey_meng2 小时前
【遵守孤儿规则的External trait pattern】
开发语言·后端·rust
天天进步20152 小时前
Vue+Springboot用Websocket实现协同编辑
vue.js·spring boot·websocket
草莓base3 小时前
【手写一个spring】spring源码的简单实现--bean对象的创建
java·spring·rpc
Estar.Lee3 小时前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip