欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-03 11:33:32
...

SpringCloud

Spring Cloud是在Spring Boot的基础上构建的,用于简化分布式系统构建的工具集,为开发人员提供快速建立分布式系统中的一些常见的模式。
实际操作以前先介绍一些微服务概念。

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

  2. 服务提供者及服务消费者
    服务提供者 服务的被调用方(即:为其他服务提供服务的服务)
    服务消费者 服务的调用方(即:依赖其他服务的服务)

  3. 熔断器(CircuitBreaker)
    在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。
    熔断器的原理很简单,如同电力过载保护器。它可以实现快速失败,如果它在一段时间内侦测到许多类似的错误,会强迫其以后的多个调用快速失败,不再访问远程服务器,从而防止应用程序不断地尝试执行可能会失败的操作,使得应用程序继续执行而不用等待修正错误,或者浪费CPU时间去等到长时间的超时产生。熔断器也可以使应用程序能够诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。

  4. API Gateway
    使用API Gateway后,客户端和微服务之间的网络图变成下图:
    使用Springcloud及Docker实现微服务架构

准备微服务代码

  • 配置本地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服务器。
使用Springcloud及Docker实现微服务架构

访问http://localhost:8000/1, 确认用户服务提供者已经启动。
使用Springcloud及Docker实现微服务架构

访问http://localhost:8010/ribbon/2,确认用户服务消费者已经启动。
使用Springcloud及Docker实现微服务架构

访问http://localhost:8050/microservice-consumer-movie-ribbon/ribbon/3, 确认api gateway正常运行。
使用Springcloud及Docker实现微服务架构

到此基于Springcloud及Docker实现的微服务例子就结束了,欢迎一起讨论,学习。
QQ:39627020
源码地址:https://github.com/39627020/spring-cloud-study