基于docker下的微服务中台搭建

搭建微服务中台

中台整个预占地址段【8090-8999】

  • 注册中心预占地址段为【8090-8099】实际使用端口号为8090、8091
  • 商品中心预占地址段为【8901-8910】实际使用端口号为8910
  • 配置中心预占地址段为【8911-8920】实际使用端口号为 apollo-configservice:8911 apollo-adminservice:8912 apollo-portal:8913

Eureka 注册中心、服务注册

预占【8090-8099】端口段,实际使用端口号为8090、8091

基于Dockerfile创建Eureka镜像

首先是编写Dockerfile文件,需要注意的是这里的Dockerfile文件名是个固定值,不能改变的,否则就会提示找不到Dockerfile文件。Dockerfile文件的语法请自行百度,此处只记录我这里用到的内容:

FROM centos:7

MAINTAINER pf

ADD jdk-8u191-linux-x64.tar.gz /usr/local/
COPY microservice-discovery-eureka-0.0.1-SNAPSHOT.jar my-eureka.jar

ENV JAVA_HOME /usr/local/java/jdk1.8.0_191
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone


接下来就是build自定义的镜像了,cd 到Dockerfile文件的目录,执行如下命令(不要忘记最后面的那个 .):

docker build -t myeureka .

执行命令成功后,会生成一个myeureka的镜像,接下来分别启动2个容器eurekafirstblood与eurekadoublekill,命令如下:

docker run -p 8090:8090 --name eurekafirstblood --net=host -d -it myeureka /bin/bash
docker run -p 8091:8091 --name eurekadoublekill --net=host -d -it myeureka /bin/bash

这里需要注意的是: 创建容器的时候一定要使用 -it /bin/bash这种方式,要不然jdk的容器起不来

然后使用docker exec -it 命令分别进入到容器shell中,并启动eureka服务,命令如下:

docker exec -it eurekafirstblood /bin/bash
java -jar my-eureka.jar --spring.profiles.active=firstblood

docker exec -it eurekadoublekill /bin/bash
java -jar my-eureka.jar --spring.profiles.active=doublekill

安装vim编辑器,修改host文件

apt-get update
apt-get install -y vim
vi /etc/hosts

在eurekafirstblood 容器中 修改host添加 172.31.119.58 doublekill
在eurekadoublekill 容器中 修改host添加 172.31.119.58 firstblood

Eureka使用问题收集

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
出现以上红色字体警告时,表示存在注册到Eureka的client,低于阀值。但是Eureka为了避免因为网络波动造成的短暂心跳连通问题直接把节点给踢出,采取的保护策略。此处延伸出阀值的概念,如下图中所示:
blob.jpg
Eureka server和client之间每隔30秒会进行一次心跳通信,告诉server,client还活着。由此引出两个名词:
Renews threshold:server期望在每分钟中收到的心跳次数
Renews (last min):上一分钟内收到的心跳次数。
renews:
1)自注册 2 + 21
2)非自注册:2
1
以上统称为自我保护机制:某时某刻一个微服务不可用了,Eurake 不会立即清理,依旧会对该微服务的信息进行保存

  默认情况下,如果 EurakeServer 在一定时间内没有接收到某个服务实例的心跳,EurakeServer 将会注销实例(默认90秒)。但是当网络分区故障发生时,微服务与 EurakeServer 之间无法正常通信,以上行为可能变的非常危险,因为微服务本身是健康的,此时本不应该注销这个服务。Eurake 通过“自我保护”来解决这个问题,当 EurakeServer 节点在短时间内丢失过多客户时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,EurakeServer 就会保护服务注册表中的信息,不在删除服务注册表中的数据(也就是不会注销任何微服务)。当故障恢复后,该 EurakeServer 节点会自动退出自我保护模式

配置中心

之前用的spring cloud config 后面准备换成apollo,2个都记录一下吧。

spring cloud config

springboot与spring cloud的版本问题要好好搞一下。
config-server 与Eureka联合使用, pom中需要引用:

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

apollo

配置中心预占地址段为【8911-8920】
实际使用端口号为

  • apollo-portal 总的为 8913
  • dev环境 apollo-configservice:8911 apollo-adminservice:8912
  • prod环境 apollo-configservice:8914 apollo-adminservice:8915
apollo部署流程

整个教程参见 官方部署指南

  1. 创建数据库 Apollo服务端依赖于MySQL数据库,所以需要事先创建并完成初始化
    数据库创建很简单,直接从apollo项目中获取现成的sql导入数据库即可,值得注意的是需要修改配置。
    blob.jpg
  2. 获取安装包 Apollo服务端安装包共有3个:apollo-configservice, apollo-adminservice, apollo-portal可以直接下载我们事先打好的安装包,也可以自己通过源码构建
    分别修改3个项目中的script文件,修改端口号为我们前面定义的
    blob.jpg
    修改build.bat文件,这个文件是全项目执行maven 编译打包的,会生成对应项目的jar文件和zip文件。取zip文件传到服务器上。
    blob.jpg
  3. 部署Apollo服务端 获取安装包后就可以部署到公司的测试和生产环境了

为apollo-configservice build专属镜像,Dockerfile直接使用官方下载下来的,打包镜像命令如下:

docker build -t apollo-configservice-dev .

启动apollo-configservice-dev容器

docker run -p 8911:8911 --name apollo-configservice-dev --net=host -d  apollo-configservice-dev

为apollo-adminservice build 专属镜像,Dockerfile直接使用官方下载下来的,打包镜像命令如下:

docker build -t apollo-adminservice-dev .

启动apollo-adminservice-dev容器

docker run -p 8912:8912 --name apollo-adminservice-dev --net=host -d  apollo-adminservice-dev

为apollo-portal build专属镜像,Dockerfile直接使用官方下载下来的,打包镜像命令如下:

docker build -t apollo-portal-dev .

启动apollo-portal容器

docker run -p 8913:8913 --name apollo-portal-dev --net=host -d  apollo-portal-dev

分别启动后,这时候查看日志应该是一堆报错,因为还没连上注册中心呢。那既然要连上注册中心,肯定需要修改相关配置,这个配置是存在数据库当中的,在ApolloConfigDb数据库的ServerConfig表中, blob.jpg 最后还需要分别修改hosts文件,使其能够以域名方式到注册中心。

然后在浏览器输入www.forever24.cn:8913 ,喜闻乐见的可视化配置界面新鲜出炉,不枉我费了半天劲改成apollo。可以接入自己的权限验证系统,比如cas,oauth2的,但是portal提供了一套默认的基于oauth简单认证的方式,初始账号:apollo,密码:admin
blob.jpg

Hystrix 断路器、熔断避免雪崩

Hystrix dashboard 可视化查看调用成功率及熔断开关

ribbon、feign 负载均衡下的服务消费

Zuul api网关

中台部分

商品中心goods-center

预占端口范围【8901-8910】
当前使用的端口号是8910

原文地址:https://www.cnblogs.com/falcon-fei/p/11060162.html