使用Spring Cloud Config实现集中配置并发布为Docker微服务
- 格式:pdf
- 大小:2.18 MB
- 文档页数:23
SpringCloud之——Config(配置中⼼)Spring Cloud Config(配置中⼼) ⼤家好,有⼀段时间没有写技术博客了。
由于⼯作上的事情,这⽅⾯很难分配时间。
近⼏年随着服务化的兴起,⼀批服务化的框架应运⽽⽣,像dubbo,thrift,spring-cloud等。
在国内使⽤dubbo的公司⾮常多,dubbo也是java程序员⾯试时必备知识点,⽽且它的官⽅⽂档写的⾮常清晰易懂,这都使得dubbo的普及⾮常容易。
thrift是apache贡献的,似乎也流⾏了⼀段时间,⼩编对这个框架不是很了解。
随后spring-cloud⼀经推出,便在技术圈流⾏起来,这段时间⼩编也在学习spring-cloud,将学到的东西和⼤家分享⼀下,如果有不对的地⽅,还请⼤家多多指正。
⼀、简介 Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端⽀持。
使⽤Config Server,您可以为所有环境中的应⽤程序管理其外部属性。
它⾮常适合spring应⽤,也可以使⽤在其他语⾔的应⽤上。
随着应⽤程序通过从开发到测试和⽣产的部署流程,您可以管理这些环境之间的配置,并确定应⽤程序具有迁移时需要运⾏的⼀切。
服务器存储后端的默认实现使⽤git,因此它轻松⽀持标签版本的配置环境,以及可以访问⽤于管理内容的各种⼯具。
Spring Cloud Config服务端特性HTTP,为外部配置提供基于资源的API(键值对,或者等价的YAML内容)属性值的加密和解密(对称加密和⾮对称加密)通过使⽤@EnableConfigServer在Spring boot应⽤中⾮常简单的嵌⼊。
Config客户端的特性(特指Spring应⽤)绑定Config服务端,并使⽤远程的属性源初始化Spring环境。
属性值的加密和解密(对称加密和⾮对称加密) ⼊门⽰例: 只要classpath下有Spring Boot Actuator和Spring Config Client,Spring Boot应⽤就会尝试连接配置服务http://localhost:8888,这个地址是spring.cloud.config.uri的默认地址。
基于SpringCloud和Docker的分布式微服务架构设计基于SpringCloud和Docker的分布式微服务架构设计随着云计算和容器技术的快速发展,分布式微服务架构成为了构建大规模应用系统的首选。
而SpringCloud和Docker作为目前最为流行的微服务框架和容器化平台,它们的结合将为分布式微服务架构的设计和部署带来巨大的便利和灵活性。
本文将针对基于SpringCloud和Docker的分布式微服务架构进行详细探讨和设计。
一、架构设计概述我们所设计的基于SpringCloud和Docker的分布式微服务架构,主要包括三个关键组件,即服务注册与发现中心、配置中心和网关服务。
详细的架构设计如下图所示:[插入架构图]1. 服务注册与发现中心:通过使用SpringCloud中的Eureka或Consul等组件,实现服务注册与发现的功能。
每个微服务在启动时会向注册中心注册自己的地址和端口信息,同时从注册中心获取其他微服务的地址信息,以实现服务之间的通信和调用。
2. 配置中心:利用SpringCloud Config等组件,实现统一的配置管理和更新。
配置中心将所有微服务的配置文件集中管理,每个微服务在启动时会从配置中心获取自己的配置信息,并可以通过配置中心动态修改、更新配置。
3. 网关服务:使用SpringCloud Gateway或Zuul等组件,作为所有外部请求的入口,对请求进行路由和过滤。
网关服务可以实现微服务之间的相互隔离、负载均衡、安全控制等功能,同时也可以对外提供统一的API接口。
除了以上三个核心组件外,每个微服务还可以根据具体需求进行拆分和设计。
每个微服务可以独立管理和部署,同时可以通过Docker容器进行封装和管理,以实现更好的弹性伸缩和高可用性。
二、微服务拆分和设计在设计基于SpringCloud和Docker的分布式微服务架构时,需要对系统进行合理的拆分和设计。
下面以一个电子商务系统为例,介绍如何拆分和设计微服务。
springcloud微服务项⽬的发布与部署普通的javaweb项⽬要发布的话,⼀般就三种⽅法:1.把项⽬直接放在tomcat的webApps下启动tomcat即可。
2.把项⽬打包成war包放在webApps下,启动tomcat,⾃动解压war包。
3.采⽤显⽰定义上下⽂的⽅法(上⾯两种都是隐式定义上下⽂),也就是改配置⽂件的⽅法,要么在Tomcat的conf/Catalina/localhost⽬录下创建⼀个XML⽂件;要么在Tomcat 的conf/server.xml⽂件中添加⼀个Context元素。
但现在发布的是微服务架构,何为微服务,就是多个⼯程,⽽且每个⼯程都相当于以前的⼀个⼯程,都⾃带了⼀个Tomcat。
然后这⾥我们有⼀个很⽅便的部署发布的⽅法,⽤运⾏jar包来发布。
下⾯讲⼀下步骤:这⾥我们⽤的开发⼯具是Spring Tool Suite,项⽬构建⼯具是Maven1.先要将将项⽬中本来的jar包清除⼀下,这⾥我们其实只关注每个⼯程target夹中的jar包。
点击项⽬,右键,run as Maven Clean(附:要是开发的时候,clean后项⽬有错误提⽰,那是因为引⽤的jar包被clean了,可以通过项⽬右键 Maven->update project来恢复)clean后,检查项⽬的target⽂件夹下没有jar包的话就可以了。
2.创建jar包:项⽬右键,run as->maven build...然后在goals⾥写package:然后run就⾏了。
每个⼯程都⾛这两步,然后就都有相对应的包。
然后这个时候我们想运⾏项⽬就⾮常⽅便了,只要在命令⾏⾥,去到jar包相应的⽬录下敲java -jar xxxxxxxx.jar即可。
为了⽅便,我们这⾥⼀般写好脚本,就这⼀⾏代码,保存为.bat后,双击该⽂件项⽬就会运⾏了。
然后讲⼀下部署的,这⾥先⽤windows系统,为了⽅便测试:⼀、windows service系统配置主要完成三个⼯作:装iis服务,JDK(java),配置安全⼯作组(开端⼝)1.装iis服务,打开服务器管理器--》添加⾓⾊和功能--》,在⾓⾊处选中>Web服务器(IIS)、在功能处选中>(.NET Framework 4.5)、IIS可承载Web核⼼和HTTP代理上的RPC 按照即可。
Springboot打包为Docker镜像并部署的实现⼀、Springboot项⽬运⾏正常打包前,Springbooot项⽬在本地必须是运⾏正常的。
我们这⾥使⽤本专栏写起来的项⽬,如下所⽰:来访问⼀下我们接⼝,做连通性验证测试:注意这⾥的地址是本地地址,因为我是在本地IDEA⾥⾯运⾏的项⽬!⼆、Maven打包项⽬执⾏如下命令即可:// 先清空再打包mvn clean package打包成功之后如下所⽰,提⽰BUILD SUCCESS,target⽬录下会有打好的jar包:注意:此处我们打包为jar包,直接部署在Docker中。
如果打为war包,则需要在Docker中先部署Tomcat(或者直接拉取Tomcat镜像),然后再将war包部署在Tomcat中,我们不搞那么复杂。
三、打包镜像前准备1、创建⼀个⽂件夹mkdir dockerFile2、进⼊⽂件夹,创建⽂件:Dockerfile(必须是这个⽂件名)cd dockerFiletouch Dockerfile3、将我们Springboot打包成的jar包也放在这个⽂件夹lsDockerfile hello_springboot.jar四、关键⼀步:编写DockerfileDockerfile的详解请阅读本专栏上⼀篇⽂章!⼀个极简的例⼦:# 拉取基础镜像FROM java:8# 设置作者信息MAINTAINER suiyi "suiyi@"# 把hello_springboot.jar添加到容器⾥,并重命名为app.jar# 因为hello_springboot.jar和Dockerfile在同⼀个⽬录下,所以只写⽂件名即可ADD hello_springboot.jar app.jar# 设置端⼝号,此处只开放⼀个端⼝8083EXPOSE 8083# 执⾏命令,此处运⾏app.jarRUN bash -c 'touch /app.jar'ENTRYPOINT ["java","-jar","app.jar"]五、打包Docker镜像运⾏⼀条命令即可(注意最后有个.号):docker build -f Dockerfile -t hello_spring:v1.0 .-f:指定Dockerfile⽂件-t:指定镜像的标签信息可以使⽤如下命令查看具体参数的作⽤:docker build --help执⾏成功后如下所⽰:六、运⾏镜像先看看有没有我们的docker镜像:docker images运⾏我们的镜像:// -p后⾯有两个端⼝,分别是:宿主机端⼝:容器端⼝docker run -p 8083:8083 --name=hello_spring hello_spring:v1.0以上是没有后台运⾏的情况,如果要后台运⾏,则添加-d参数即可:// -p后⾯有两个端⼝,分别是:宿主机端⼝:容器端⼝docker run -d -p 8083:8083 --name=hello_spring hello_spring:v1.0⾮后台运⾏之后效果如下:七、验证部署的项⽬我们来访问⼀下我们接⼝,做连通性测试:注意这⾥的地址是部署Docker机器的地址,可见我们已经成功将我们的Springboot项⽬打包成Docker并部署运⾏了!到此这篇关于Springboot打包为Docker镜像并部署的实现的⽂章就介绍到这了,更多相关Springboot打包Docker镜像内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
SpringCloudConfig配置(基于Consul)⼀,构建配置中⼼ 1.在pom.xml⽂件中添加相关依赖 <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> </dependencies> 2.在SpringBoot程序主类上添加@EnableConfigServer注解, 开启SpringCloud Config的服务端功能 @SpringBootApplication @EnableConfigServer public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 3.在application.properties中添加相关配置信息 =config-server server.port=7001 #Git仓库位置 spring.cloud.config.server.git.uri=https:///*****/config-properties.git #指定Git仓库路径下的⽂件夹 spring.cloud.config.server.git.search-paths=myconfig ername=username spring.cloud.config.server.git.password=password #指定Git分⽀ bel=dev 4.URL调⽤查看配置是否⽣效 (1) /{application}/{profile}[/{label}] (2) /{application}-{profile}.yml 上⾯的url会映射{application}-{profile}.properties对应的配置⽂件,其中{label}对应Git不同的分⽀, 默认为master.{"name": "application","profiles": ["myproject"],"label": null,"version": "","state": null,"propertySources": [{"name": "https:///****/config-properties.git/master/application-myproject.properties","source": {"server.servlet.context-path": "/myproject","server.port": "7002","": "myproject","spring.cloud.consul.host": "localhost","spring.cloud.consul.port": "8500","spring.cloud.consul.discovery.health-check-path": "${server.servlet.context-path}/healthcheck","spring.cloud.consul.discovery.register": "true"}}]} 配置服务器在从Git中获取配置信息后, 会存储⼀份在 config-server 的⽂件系统中, 实质上 config-server 是通过 git clone 命令将配置内容复制了⼀份在本地存储, 然后读取这些内容并返回给微服务应⽤进⾏加载. config-serve r 通过 Git 在本地仓库暂存,可以有效防⽌ Git 仓库出现故障⽽引起⽆法加载配置信息的情况.⼆.客户端配置映射 1.在pom.xml⽂件中添加相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> 2.创建SpringBoot的应⽤主类 @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 3.创建boostrap.properties配置,来指定获取配置⽂件的config-server位置 spring.cloud.config.enabled=true #配置中⼼config-server的地址 spring.cloud.config.uri=http://127.0.0.1:23001/ #对应配置⽂件规则中的{application}部分 =application #对应配置⽂件规则中的{profile}部分 spring.cloud.config.profile=order #Git分⽀ bel=dev ername=q741622318@ spring.cloud.config.password=bananas66424 SpringBoot对配置⽂件的加载顺序, 本应⽤jar报之外的配置⽂件加载会优先于应⽤jar包内的配置内容, ⽽通过bootstrap.properties对config-server的配置, 使得该应⽤从config-server中获取⼀些外部配置信息, 这些信息的优先级⽐本地的内容要⾼, 从⽽实现外部化配置.三.服务端详解 (1)Git仓库的Hook功能可以帮助我们实时监控配置内容的修改. (2)占位符配置URI {application}, {profile}, {label}这些占位符除了⽤于标识配置⽂件的规则之外, 还可以⽤于 Config Server 中对 Git 仓库地址的URI配置. ⽐如通过{application}占位符来实现同时匹配多个不同服务的配置仓库 spring.cloud.config.server.git.uri=https:///*****/{application}-properties.git ⼜⽐如通过{application}占位符实现⼀个应⽤⼀个⽬录的效果 spring.cloud.config.server.git.search-paths={application} (3)属性覆盖 Config Server 有"属性覆盖"的特性, 它可以让开发⼈员为所有的应⽤提供配置属性, 只需要通过spring.cloud.config.server.overrides 属性来设置键值对的参数, 这些参数会以 Map 的⽅式加载到客户端的配置中. ⽐如: =userstring (4)安全保护 由于我们的微服务应⽤和配置中⼼都构建于 Spring Boot 基础上,所以与 Spring Security 结合使⽤会更加⽅便. 在 pom.xml 中引⼊依赖后,不需要任何其他改动就能实现对配置中⼼访问的安全保护. <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency> 在配置⽂件中指定⽤户和密码, ⽐如: =user er.password=37CC5635-559b-4e6f-b633-7e932b813f73 由于我们已经为 config-server 设置了安全保护, 需要在客户端中加⼊安全信息才可以正常访问服务端. ername=user spring.cloud.config.password=37CC5635-559b-4e6f-b633-7e932b813f73 (5)加密解密 使⽤加密解密功能时, 需要在配置中⼼的运⾏环境中安装不限长度的JCE版本. 我们可以从Oracle 的官⽅⽹站下载, 它是⼀个压缩包,解压后可以看到下⾯三个⽂件: README.TXT local_policy.jar US_export_policy.jar 之后将 local_policy.jar 和 US_export_policy.jar 两个⽂件复制到$JAVA_HOME/jre/lib/security ⽬录下. 再配置加密数据, 如下: ername=user spring.datasource.password={cipher}dba650baa81d78bd08799d8d4429de499bd4c2053c05f029e7cfbf143695f5b 通过在属性值前使⽤{cipher}前缀来标注该内容为加密值, 当微服务客户端加载配置时, 配置中⼼会⾃动为带有{cipher}前缀的值进⾏解密.。
基于Spring Cloud和Docker的微服务架构设计作者:王方旭来源:《中国信息化》2018年第03期一、概述随着互联网、云计算的进步,微服务越来越受到从业者的关注。
尤其是以单体架构建设的应用和SOA架构的应用皆无法解决数据、服务呈爆炸式增长带来的冲击,而微服务将业务系统彻底组件化、服务化的思想让系统建设者有了更多选择。
微服务的核心思想是:应用是由相互独立的服务组成,这些服务可分布式部署,运行在独立的进程中,通过轻量级的通信机制交互信息,服务独立扩展,自由伸缩,但有明确的边界,不受开发语言、技术路线、开发团队的制约。
Spring Cloud是实践微服务的框架,有活跃的开源社区支持;Docker使分布式应用脱离底层物理硬件和基础环境的限制,实现应用快速开发和部署而大放异彩的开源项目。
因此,使用Spring Cloud框架和Docker构建的微服务系统是实现开发、部署、运维一体化的DevOps模式的最佳解决方案。
二、Spring Cloud(一) Spring Cloud简介及架构图Spring boot是由 Pivotal 团队提供的框架,按照约定大于配置的核心思想对Spring框架进行了简化。
Spring Cloud是基于Spring Boot推出一系列框架、组件的有序集合,简化了分布式系统基础设施的开发,且封装的框架均是成熟且经过实际检验的,比如面向服务发现治理的EureKa,面向负载均衡的Ribbon等。
经过封装,向开发者提供的则是易理解、易部署、易交互的分布式系统开发框架。
下图,展示了Spring Cloud框架完整架构图。
(二) Spring Cloud框架中的组件1. Eureka在Spring Cloud框架中实现微服务的自动注册与发现。
定义服务注册中心是在启动类配置@ EnableEurekaServer;定义服务提供者是在其启动类配置@EnableEurekaClient,该注解声明服务是Eureka客户端,具备服务注册和发现能力。
Spring-cloudConfigServer的3种配置⽅式⽬录Spring-cloud Config Server的3种配置1.config 默认Git加载2.加载本地开发环境3.加载本地物理环境4.加载svn环境springcloud统⼀配置中⼼(config server 端)1.为什么要使⽤统⼀配置中⼼?2.登陆github 创建⼀个⽤于存放配置的项⽬3.存放配置的项⽬的git地址配置到项⽬的yml中4.项⽬中的配置(Spring Cloud Config server 端)5.再git上创建⽂件夹⽤来存放配置信息6.访问config server7.把远端的git拉到本地的git来Spring-cloud Config Server的3种配置Spring-cloud Config Server 有多种种配置⽅式,今天我就在此介绍⼀下Git,local,svn三种配置⽅式,不过官⽅⽂档还是建议使⽤Git这种⽅式进⾏配置开发。
好的,现在开始1.config 默认Git加载2.加载本地开发环境spring.profiles.active=nativespring.cloud.config.server.native.searchLocations=classpath:/config3.加载本地物理环境spring.profiles.active=nativespring.cloud.config.server.native.searchLocations= file:E:\\Java\\config4.加载svn环境### config server svnspring.cloud.config.server.svn.uri=http://localhost:8080/dmeo/development/trunkername=xxxspring.cloud.config.server.svn.password=xxxspring.profiles.active=subversionPS: svn 环境需要引⼊ SVN jar包<groupId>org.tmatesoft.svnkit</groupId><artifactId>svnkit</artifactId>springcloud统⼀配置中⼼(config server 端)1.为什么要使⽤统⼀配置中⼼?1.配置不⽅便维护2.配置内容的安全性和权限3.更新配置项⽬需要重启2.登陆github 创建⼀个⽤于存放配置的项⽬3.存放配置的项⽬的git地址配置到项⽬的yml中4.项⽬中的配置(Spring Cloud Config server 端)该项⽬即是eureka的客户端⼜是Config的服务端<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.zhu</groupId><artifactId>config</artifactId><version>0.0.1-SNAPSHOT</version><name>config</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Greenwich.RELEASE</spring-cloud.version></properties><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><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/milestone</url></repository></repositories></project>yml配置eureka:client:service-url:defaultZone: http://localhost:8085/eureka/server:port: 8090spring:application:name: configcloud:config:server:git:uri: git@:zhujin888/config-repo.git //git地址username: git的账号password: git的密码主类:package com.zhu.config;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.config.server.EnableConfigServer;@SpringBootApplication@EnableDiscoveryClient@EnableConfigServerpublic class ConfigApplication {public static void main(String[] args) {SpringApplication.run(ConfigApplication.class, args);}}5.再git上创建⽂件夹⽤来存放配置信息⼀般存三份dev:开发test:测试pro:⽣产6.访问config server两种⽅式:随便⽤哪⼀种7.把远端的git拉到本地的git来配置本地 git路径eureka:client:service-url:defaultZone: http://localhost:8085/eureka/server:port: 8090spring:application:name: configcloud:config:server:git:uri: git@:zhujin888/config-repo.gitusername:password:basedir: D:\My_Java\anli\gitconfig\basedir //配置本地git路径把拉下来的配置⽂件存在这以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
springboot整合docker部署实现两种构建Docker镜像⽅式Docker是⼀个开源的引擎,可以轻松的为任何应⽤创建⼀个轻量级的、可移植的、⾃给⾃⾜的容器。
开发者在笔记本上编译测试通过的容器可以批量地在⽣产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应⽤平台。
docker的应⽤场景web应⽤的⾃动化打包和发布;⾃动化测试和持续集成、发布;在服务型环境中部署和调整数据库或其他的后台应⽤;从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建⾃⼰的PaaS环境。
项⽬结构package hello;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@SpringBootApplication@RestControllerpublic class Application {@RequestMapping("/")public String home() {return "Hello Docker World";}public static void main(String[] args) {SpringApplication.run(Application.class, args);}}server:port: 8010#TODO: figure out why I need this here and in bootstrap.ymlspring:application:name: testLatticeAppribbon:ServerListRefreshInterval: 1000endpoints:health:sensitive: falserestart:enabled: trueshutdown:enabled: trueDockfileFROM frolvlad/alpine-oraclejdk8:slimVOLUME /tmpADD gs-spring-boot-docker-master-0.0.1-SNAPSHOT.jar app.jarRUN sh -c 'touch /app.jar'ENV JAVA_OPTS=""ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]解释下这个配置⽂件:VOLUME 指定了临时⽂件⽬录为/tmp。
使用Spring Cloud和Docker构建微服务架构如何使用Spring Boot、Spring Cloud、Docker和Netflix的一些开源工具来构建一个微服务架构。
本文通过使用Spring Boot、Spring Cloud和Docker构建的概念型应用示例,提供了了解常见的微服务架构模式的起点。
功能服务整个应用分解为三个核心微服务。
它们都是可以独立部署的应用,围绕着某些业务功能进行组织。
账户服务包含一般用户输入逻辑和验证:收入/开销记录、储蓄和账户设置。
统计服务计算主要的统计参数,并捕获每一个账户的时间序列。
数据点包含基于货币和时间段正常化后的值。
该数据可用于跟踪账户生命周期中的现金流量动态。
通知服务存储用户的联系信息和通知设置(如提醒和备份频率)。
安排工作人员从其它服务收集所需的信息并向订阅的客户发送电子邮件。
注意▪每一个微服务拥有自己的数据库,因此没有办法绕过API直接访问持久数据。
▪在这个项目中,我使用MongoDB作为每一个服务的主数据库。
拥有一个多种类持久化架构(polyglot persistence architecture)也是很有意义的。
▪服务间(Service-to-service)通信是非常简单的:微服务仅使用同步的REST API进行通信。
现实中的系统的常见做法是使用互动风格的组合。
例如,执行同步的GET请求检索数据,并通过消息代理(broker)使用异步方法执行创建/更新操作,以便解除服务和缓冲消息之间的耦合。
然而,这带给我们是最终的一致性。
基础设施服务分布式系统中常见的模式,可以帮助我们描述核心服务是怎样工作的。
Spring Cloud提供了强大的工具,可以增强Spring Boot应用的行为来实现这些模式。
我会简要介绍一下:配置服务Spring Cloud Config是分布式系统的水平扩展集中式配置服务。
它使用了当前支持的本地存储、Git和Subversion等可拔插存储库层(repository layer)。
使⽤Docker部署SpringCloud项⽬详细步骤准备⼯作JDK1.8、Docker1.12.1、CentOS7.01.CentOS7.0下JDK1.8的安装(1)到Oracle官⽹下载好 jdk-8u181-linux-x64.tar.gz 备⽤(2)卸载系统⾃带的javajava -versionrpm -qa|grep javayum -y remove [上⾯查出来的东西,多个⽤空格分隔](3)安装jdkcd /usr #进⼊到要安装jdk的⽬录mkdir java #创建java⽬录,将jdk-8u181-linux-x64.tar.gz上传到此⽬录tar -zxvf jdk-8u181-linux-x64.tar.gz #将jdk压缩包解压安装(4)配置环境变量vim /etc/profile找到:export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL 这⼀⾏,并在其下⾯⼀⾏添加如下内容:export JAVA_HOME=/usr/java/jdk1.8.0_181export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar使环境变量⽣效source /etc/profile测试安装java -version2.Docker的安装(1)查看内核版本(Docker需要64位版本,同时内核版本在3.10以上,如果版本低于3.10,需要升级内核)uname -r(2)更新yum包:yum update(3)添加yum仓库:sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'[dockerrepo]name=Docker Repositorybaseurl=https:///repo/main/centos/7/enabled=1gpgcheck=1gpgkey=https:///gpgEOF(4)安装Dockeryum install docker-engine(5)启动Dockerservice docker start(6)配置docker远程访问执⾏命令编辑⽂件vim /usr/lib/systemd/system/docker.service找到这⼀⾏ExecStart=/usr/bin/dockerd改为ExecStart=/usr/bin/dockerd -H tcp:unix:修改完成后保存并重启Dockerservice docker restart测试访问 http://125.35.86.214:2375/version 如果有返回数据则配置成功。
使用Spring Cloud Config实现集中配置并发布为Docker微服务2017年2月一、Spring Cloud用来解决什么问题Spring Cloud 是Pivotal提供的用于简化分布式系统构建的工具集,开源软件。
Spring Cloud 为开发人员提供了工具,快速建立分布式系统中的一些常见的模式(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,集群状态……)。
Spring Cloud基于Spring Boot等工具集,Spring有一套解决方案。
一、Spring Cloud用来解决什么问题•Centralized external configuration management backed by a git repository. The configuration resources map directly to Spring `Environment` but could be used by non ‐Spring applications if desired.Spring Cloud Config•Integration with various Netflix OSS components (Eureka, Hystrix, Zuul, Archaius, etc.).Spring Cloud Netflix•An event bus for linking services and service instances together with distributed messaging. Useful for propagating state changes across a cluster (e.g. config change events).Spring Cloud Bus •Integrates your application with Pivotal Cloudfoundry. Provides a service discovery implementation and also makes it easy to implement SSO and OAuth2 protected resources, and also to create a Cloudfoundry service broker.Spring Cloud for Cloud Foundry•Provides a starting point for building a service broker that manages a Cloud Foundry managed service.Spring Cloud Cloud Foundry Service Broker•Leadership election and common stateful patterns with an abstraction and implementation for Zookeeper, Redis, Hazelcast, Consul.Spring Cloud Cluster•Service discovery and configuration management with Hashicorp Consul.Spring Cloud Consul •Provides support for load ‐balanced OAuth2 rest client and authentication header relays in a Zuul proxy.Spring Cloud Security•Distributed tracing for Spring Cloud applications, compatible with Zipkin, HTrace and log ‐based (e.g. ELK) tracing.Spring Cloud Sleuth 一、Spring Cloud用来解决什么问题•A cloud ‐native orchestration service for composable microservice applications on modern runtimes. Easy ‐to ‐use DSL, drag ‐and ‐drop GUI, and REST ‐APIs together simplifies the overall orchestration of microservice based data pipelines.Spring Cloud Data Flow•A lightweight event ‐driven microservices framework to quickly build applications that can connect to external systems. Simple declarative model to send and receive messages using Apache Kafka or RabbitMQ between Spring Boot apps.Spring Cloud Stream•Spring Cloud Stream App Starters are Spring Boot based Spring Integration applications that provide integration with external systems.Spring Cloud Stream App Starters•A short ‐lived microservices framework to quickly build applications that perform finite amounts of data processing. Simple declarative for adding both functional and non ‐functional features to Spring Boot apps.Spring Cloud Task•Spring Cloud Task App Starters are Spring Boot applications that may be any process including Spring Batch jobs that do not run forever, and they end/stop after a finite period of data processing.Spring Cloud Task App Starters•Service discovery and configuration management with Apache Zookeeper.Spring Cloud Zookeeper•Easy integration with hosted Amazon Web Services. It offers a convenient way to interact with AWS provided services using well ‐known Spring idioms and APIs, such as the messaging or caching API. Developers can build their application around the hosted services without having to care about infrastructure or maintenance.Spring Cloud for Amazon Web Services•Makes it easy for PaaS applications in a variety of platforms to connect to backend services like databases and message brokers (the project formerly known as "Spring Cloud").Spring Cloud Connectors•Spring Boot ‐style starter projects to ease dependency management for consumers of Spring Cloud. (Discontinued as a project and merged with the other projects after Angel.SR2.)Spring Cloud Starters•Spring Boot CLI plugin for creating Spring Cloud component applications quickly in GroovySpring Cloud CLI一、Spring Cloud用来解决什么问题提供集中式的外部配置管理服务,基于GIT配置库。
配置资源可以直接映射到Spring的“Environment”,也能给非Spring程序用。
一、Spring Cloud用来解决什么问题配置与程序分离二、运行Demohttp://spring.io/guides/gs/centralized-configuration/二、运行Demohttp://cloud.spring.io/spring-cloud-config/二、运行Democonfiguration-service:服务端,是一个Web服务器,从GIT获得配置信息configuration-client:客户端,也是一个Web服务器,从server 端获取配置信息二、运行Demoapplication.properties中的配置:server.port,端口号spring.cloud.config.server.git.uri,Git配置库的地址二、运行DemoPOM配置:基于Spring Boot启动Spring cloud config Server二、运行Demo需要加@EnableConfigServer二、运行Demobootstrap.properties中的配置:,客户端应用的名字spring.cloud.config.uri,服务端地址二、运行DemoPOM配置:也是基于Spring Boot二、运行Demo在GitLab创建一个工程二、运行Demo在Git库中增加a-bootiful-client.properties注意:文件名和client中配置的应用名字相同执行命令:git initgit clone http://192.168.99.101/xxx/First.gitgit add a-bootiful-client.propertiesgit commit -m "add client.properties"git push -u origin master二、运行Demoa-bootiful-client.properties可以是一个YAML文件二、运行Demo先启动Server:二、运行Demo再启动client,访问http://localhost:8080/message就能显示在a-bootiful-client.properties中配置的message了二、运行Demo@RefreshScope标签通过http://localhost:8080/refresh刷新配置二、运行Demo修改a-bootiful-client.propertiesCommit、push到GIT以POST方式,执行http://localhost:8080/refresh二、运行Demo服务端刷新,如果是windows系统,新的配置文件被GIT同步到当前用户目录的AppData/Temp目录下客户端刷新,重新从localhost:8888取配置信息二、运行Demo新建工程,用mvn install得到config-service-0.0.1-SNAPSHOT.jar二、运行Demo写好Dockerfile可以基于openjdk:8-jre-alpine构建二、运行Demo因为是Windows系统,在MINGW64中:cd /D/config-serverTouch dockerfiledocker build -t config-server .二、运行Demo启动Server的命令:docker run -h 172.17.0.1 -p 8888:8888 config-server二、运行Demo把Client中配置的Server地址改为微服务地址:http://192.168.99.100:8888二、运行Demo在命令行运行时,--传参数和在application.properties中配置属性值是一样的java -jar xxx.jar --server.port=8888命令,等价于在application.properties中添加属性server.port=8888考虑到安全性,Spring Boot提供了程序开关,可以屏蔽在命令行中配置属性:SpringApplication.setAddCommandLineProperties(false)在Dockerfile中,用${属性名:-缺省值}获得环境变量两个变量名自定义,例如:PORT、GITURI在启动微服务时传入参数:docker run -d -h 172.17.0.1 -p 8888:8888 -e PORT="8888" -e GITURI="http://192.168.99.100/xxx/first.git" config-server 二、运行Demo 重新做镜像,在启动微服务的docker run命令行中,用-e传入对应的环境变量(PORT、GITURI):docker run –d -h 172.17.0.1 -p 8888:8888 -e PORT="8888" -e GITURI="http://192.168.99.100/xxx/first.git" config-server注释掉application.properties中的配置信息二、运行Demo三、理解Spring Cloud Config的用法Environment Repository是一个逻辑概念,用来保存Spring的环境变量(Environment),每个Environment依赖于3个参数定位:{application},映射到客户端的"" {profile}映射到客户端的“spring.profiles.active”,使用逗号分隔{label}服务器端配置文件的“版本“三、理解Spring Cloud Config的用法例如,在前面执行的Demo中,对应的参数值:application :a-bootiful-clientprofiles:defaultlabel:master在浏览器中访问:http://192.168.99.101:8888/a-bootiful-client/default/master显示Environment三、理解Spring Cloud Config的用法org.springframework.cloud.config.environment.Environment. EnvironmentRepository类只有一个方法,传入application、profile、label三个参数三、理解Spring Cloud Config的用法缺省返回JSON格式,Spring提供了以下访问方式:/{application}/{profile}[/{label}]/{application}-{profile}.yml/{label}/{application}-{profile}.yml/{application}-{profile}.properties/{label}/{application}-{profile}.properties……可见,只要提交一种格式的配置文件,通过不同访问方式,得到不同格式的配置文件三、理解Spring Cloud Config的用法org.springframework.cloud.config.server.environmentEnvironmentController中使用@RequestMapping声明了所有的配置文件转换方式,实际上内部都是Environment对象三、理解Spring Cloud Config的用法Label标签可以对应于GIT的分支名称、commit id或其他标签。