最近在完成毕业设计,题目是《基于微服务的B2C网上商城系统的设计与实现》,整个项目最早是我在看黑马的培训视频时学习JavaWeb做的一个项目,第一次做完大约在去年过年的时候,这个项目前前后后自己改了差不多5、6次了,使用技术不断更新(还有一些小细节的修改比如最早购物车用Session后来用Redis存储),从最早的Servlet+Filter到SSM+Redis到SpringBoot+Thymeleaf+Redis到SpringBoot+Thymeleaf+Redis+RabbitMQ+Eureka+Spring Cloud Config(这时候已经彻底前后台分离了),现在做的应该是这个项目的最后一个版本了,整体采用SpringBoot+Spring Cloud(用到了Eureka、Ribbon、Fegin后面可能还会加一些但是部署起来要顶不住了)+Redis+RabbitMQ
这次Eureka做了三个节点集群统一部署在阿里云,前台4个服务模块,每个模块两个节点部署在一台虚拟机上,web层调用做了一个节点部署在一台虚拟机上,还用Nginx做了图片服务器(这块参数还可以调整一下,最近也在学习Nginx),目前还没有做的是后台的部署,之前发现的一些小BUG的修改还有集成配置中心(今天在做)
Eureka截图:
此次的配置中心采用了携程开源的Apollo,也是我来公司接触公司的新系统中采用的,感觉比SpringCloud提供的ConfigServer好用很多,正好借这次毕业设计的机会好好学习一下Apollo
Apollo(阿波罗)是携程开源的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景
Apollo基础模型:
Apollo对比Spring Cloud Config:
官方GitHub:https://github.com/ctripcorp/apollo
1)、从GitHub上源码下载下来
其中几个比较重要的项目:
配置发布的大致过程:用户在Portal操作配置发布,Portal调用Admin Service的接口操作发布,Admin Service发布配置后,发送ReleaseMessage给各个Config Service,Config Service收到ReleaseMessage后,通知对应的客户端
2)、数据库初始化
3)、调整配置并打包
修改apollo-master\scripts
中的配置文件build.bat
或者build.sh
A.数据库配置
# apollo config db info
apollo_config_db_url=jdbc:mysql://xxx:3306/ApolloConfigDB?characterEncoding=utf8
apollo_config_db_username=root
apollo_config_db_password=123456
# apollo portal db info
apollo_portal_db_url=jdbc:mysql://xxx:3306/ApolloPortalDB?characterEncoding=utf8
apollo_portal_db_username=root
apollo_portal_db_password=123456
B.修改环境调用地址
# meta server url, different environments should have different meta server addresses
dev_meta=http://localhost:8080
fat_meta=http://localhost:8080
uat_meta=http://localhost:8080
pro_meta=http://localhost:8080
C.修改数据库数据
在ApolloConfigDB数据库中,找到表ServerConfig中的eureka.service.url配置项修改为http://192.168.126.146:8080/eureka/
D.编译打包
$ ./build.sh
该脚本会依次打包apollo-configservice, apollo-adminservice, apollo-portal和apollo-client
1)、部署apollo-configservice
将apollo-master\apollo-configservice\target目录下的apollo-configservice-1.4.0-SNAPSHOT-github.zip上传到服务器解压
修改scripts/startup.sh
SERVICE_NAME=apollo-configservice
## Adjust log dir if necessary
LOG_DIR=/shop-apollo/logs
## Adjust server port if necessary
SERVER_PORT=8080
2)、部署apollo-adminservice
将apollo-master\apollo-adminservice\target目录下的apollo-adminservice-1.4.0-SNAPSHOT-github.zip上传到服务器解压
修改scripts/startup.sh
SERVICE_NAME=apollo-adminservice
## Adjust log dir if necessary
LOG_DIR=/shop-apollo/logs
## Adjust server port if necessary
SERVER_PORT=8090
3)、部署apollo-portal
将apollo-master\apollo-portal\target目录下的apollo-portal-1.4.0-SNAPSHOT-github.zip上传到服务器解压
修改scripts/startup.sh
SERVICE_NAME=apollo-portal
## Adjust log dir if necessary
LOG_DIR=/shop-apollo/logs
## Adjust server port if necessary
SERVER_PORT=8070
执行scripts目录下的startup.sh启动apollo-configservice、apollo-adminservice和apollo-portal
nohup ./startup.sh &
启动成功后访问客户端:192.168.126.146:8070
默认用户名密码为:apollo/admin
1)、添加Apollo依赖
<dependency>
<groupId>com.ctrip.framework.apollogroupId>
<artifactId>apollo-clientartifactId>
<version>1.1.0version>
dependency>
<dependency>
<groupId>com.ctrip.framework.apollogroupId>
<artifactId>apollo-coreartifactId>
<version>1.1.0version>
dependency>
2)、编写application.yml文件
spring:
application:
name: shop-web
app:
id: shop-web
# set apollo meta server address, adjust to actual address if necessary
apollo:
meta: http://192.168.126.146:8080/
3)、主启动类上使用@EnableApolloConfig注解标注
//启用Apollo配置中心
@EnableApolloConfig
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = { "com.hand.shop" })
public class ShopWebApplication {
public static void main(String[] args) {
SpringApplication.run(ShopWebApplication.class, args);
}
}
Apollo中的配置信息如下:最重要的是AppId要和application.yml中配置的app.id相对应
使用Apollo的过程中如果不同的项目存在相同配置信息,如何把共有的配置信息提取出来共用,使用公共的Namespace可以解决这个问题的,新建公共的Namespace存放公共配置,另一个项目再关联这个Namespace就可以共用配置信息了
1)、最好新建一个独立的项目用来存储共用配置信息,创建Namespace
2)、公共Namespace添加配置信息并发布
3)、另一个项目关联这个Namespace来共用配置了
SimpleProject项目:
提交之后效果如下:
5)、修改项目中的配置信息
app:
id: SimpleProject
apollo:
meta: http://192.168.126.147:8080/
bootstrap:
enabled: true
namespaces: application,common
项目存在多个Namespace时,需要显示指定apollo.bootstrap.namespaces配置信息,每个Namespace之间用,
隔开
GitHub地址:https://github.com/hxt970311/Apollo-Test
Namespace详解:https://github.com/ctripcorp/apollo/wiki/Apollo核心概念之“Namespace”