您的位置:首页 > 运维架构 > Docker

使用Springcloud及Docker实现微服务架构

2017-09-21 12:18 681 查看

SpringCloud

Spring Cloud是在Spring Boot的基础上构建的,用于简化分布式系统构建的工具集,为开发人员提供快速建立分布式系统中的一些常见的模式。

实际操作以前先介绍一些微服务概念。

服务发现

在微服务架构中,服务发现(Service Discovery)是关键原则之一。手动配置每个客户端或某种形式的约定是很难做的,并且很脆弱。Spring Cloud提供了多种服务发现的实现方式,例如:Eureka、Consul、Zookeeper。

Spring Cloud支持得最好的是Eureka,其次是Consul,最次是Zookeeper。

服务提供者及服务消费者

服务提供者 服务的被调用方(即:为其他服务提供服务的服务)

服务消费者 服务的调用方(即:依赖其他服务的服务)

熔断器(CircuitBreaker)

在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。

熔断器的原理很简单,如同电力过载保护器。它可以实现快速失败,如果它在一段时间内侦测到许多类似的错误,会强迫其以后的多个调用快速失败,不再访问远程服务器,从而防止应用程序不断地尝试执行可能会失败的操作,使得应用程序继续执行而不用等待修正错误,或者浪费CPU时间去等到长时间的超时产生。熔断器也可以使应用程序能够诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。

API Gateway

使用API Gateway后,客户端和微服务之间的网络图变成下图:



准备微服务代码

配置本地hosts文件

在生产环境下,我们往往会为每个应用配置一个host,使用host而非IP进行访问。为了更加贴近生产环境,以及后文Docker章节的讲解,我们首先配置一下Host

AMIDdeAir:~ amid$ sudo cat /etc/hosts
127.0.0.1 localhost discovery config-server gateway movie user


准备微服务程序

我们这里新建下面几个项目,由于项目程序较多,可以到github上下载源码,这里就不贴源码了。github地址:https://github.com/39627020/spring-cloud-study

1.microservice-api-gateway(api gateway服务)8500端口

2.microservice-discovery-eureka(服务发现服务)8761端口

3.microservice-provider-user(用户服务提供者)8000端口

4.microservice-consumer-movie-ribbon(用户服务消费者)8010端口

Dockerfile

以Discovery服务的Dockerfile为例介绍下Dockerfile文件。

新建discovery目录,将microservice-discovery-eureka-0.0.1-SNAPSHOT.jar文件拷贝到文件夹当中,然后新建Dockerfile文件。

AMIDdeAir:image amid$ mkdir image
AMIDdeAir:image amid$ cd image
AMIDdeAir:image amid$ mkdir discovery
AMIDdeAir:image amid$ cd discovery
AMIDdeAir:discovery amid$ ls
Dockerfile                                              microservice-discovery-eureka-0.0.1-SNAPSHOT.jar
AMIDdeAir:discovery amid$ vi Dockerfile
#基于哪个镜像
FROM java:8

# 将本地文件夹挂载到当前容器
VOLUME /tmp

# 拷贝文件到容器,也可以直接写成ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar /app.jar
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar /app.jar
#RUN bash -c 'touch /app.jar'

# 开放8761端口
EXPOSE 8761

# 配置容器启动后执行的命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]


退到image目录,编辑docker-compose.yml文件,同时管理多个docker容器。

discovery:
build: ./discovery
ports:
- "8761:8761" #将宿主机8761端口绑定到容器8761端口
expose:
- 8761        #暴露容器8761端口
user:
build: ./user
ports:
- "8000:8000"
expose:
- 8000
links:
- discovery   #可以访问discovery容器
movie:
build: ./movie
ports:
- "8010:8010"
expose:
- 8010
links:
- discovery
- user
gateway:
build: ./gateway
ports:
- "8050:8050"
expose:
- 8050
links:
- discovery
- user
- movie


完成后执行sudo docker-compose up,进行构建。

AMIDdeAir:image amid$ sudo docker-compose up


访问http://localhost:8761/,确认服务都已经注册到Eureka服务器。



访问http://localhost:8000/1, 确认用户服务提供者已经启动。



访问http://localhost:8010/ribbon/2,确认用户服务消费者已经启动。



访问http://localhost:8050/microservice-consumer-movie-ribbon/ribbon/3, 确认api gateway正常运行。



到此基于Springcloud及Docker实现的微服务例子就结束了,欢迎一起讨论,学习。

QQ:39627020

源码地址:https://github.com/39627020/spring-cloud-study
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息