7天学会spring cloud教程
- 格式:pdf
- 大小:387.99 KB
- 文档页数:14
SpringCloudNetflix⼊门简介回顾微服务架构微服务架构4个核⼼问题:1. 服务很多,客户端该怎么访问?2. 这么多服务,服务之间如何通信?3. 这么多服务,如何治理?4. 某个服务挂了怎么办?解决⽅案:springCoud:它是⼀种⽣态!它是基于springboot构建的它落地的流⾏实现有以下三个:1.Spring Cloud NetFlix ⼀站式解决⽅案!(NetFlix停更不停⽤)api⽹关:zuul组件Feign:它是基于HttpClient的,也就是基于Http的通信⽅式:同步阻塞的eureka:服务注册与发现,就是来服务治理的Hystrix:熔断机制,某个服务挂了采⽤的机制。
等其他组件2.Apache Dubbo Zookeeper 半⾃动,需要整合别⼈的东西!API⽹关:没有,需要找第三⽅组件,或者⾃⼰实现Dubbo: RPC框架,⽤于服务间通信(很专业)Zookeeper: 服务注册与发现熔断机制:没有,可以借助Hystrix组件可以得出个结论:Dubbo这个⽅案并不完善3.Spring Cloud Alibaba 最新的⼀站式解决⽅案! 更简单新概念:服务⽹格 server Mesh它的代表落地实现: istio万变不离其宗:1.API⽹关解决服务路由2.HTTP,RPC解决服务通信3.服务注册与发现,实现⾼可⽤4.熔断机制,解决服务挂了的问题,也就是服务降级本质: ⽹络不可靠常见⾯试题1.1 什么是微服务?1.2 微服务之间是如何独⽴通讯的?1.3 SpringCloud 和 Dubbo有那些区别?1.4 SpringBoot 和 SpringCloud,请谈谈你对他们的理解1.5 什么是服务熔断?什么是服务降级?1.6 微服务的优缺点分别是什么?说下你在项⽬开发中遇到的坑1.7 你所知道的微服务技术栈有哪些?列举⼀⼆1.8 Eureka和Zookeeper都可以提供服务注册与发现的功能,请说说两者的区别…微服务概述什么是微服务?微服务(Microservice Architecture) 是近⼏年流⾏的⼀种架构思想,关于它的概念很难⼀⾔以蔽之。
微服务与Spring Cloud何为微服务?Spring Cloud是什么?何为微服务?1、微服务是属于一种软件架构。
2、微服务是由多个服务组成的集合体。
3、微服务里面的每个服务都是独立的存在。
4、微服务是一种去中心化的思想。
微服务与Spring Cloud1、开发相对简单2、技术栈灵活3、服务独立解耦4、可用性高微服务与Spring Cloud1、维护和部署复杂度的增加2、服务间通信的成本3、数据一致性(分布式事务)4、系统集成测试微服务与Spring CloudSpring Cloud是什么?1、Spring Cloud是基于Spring Boot来实现的。
2、Spring Cloud是一系列工具框架的集合体。
3、Spring Cloud提供了一套完整的微服务解决方案。
此处是个广告!Spring Boot教程推荐:/course/view/c99516ea604d4053908c1768d6deee3d微服务与Spring Cloud1、Spring Cloud Config 配置中心,利用git集中管理程序的配置。
2、Spring Cloud Netflix 集成众多Netflix的开源软件3、Spring Cloud Bus 消息总线,利用分布式消息将服务和服务实例连接在一起,用于在一个集群中传播状态的变化4、Spring Cloud for Cloud Foundry 利用Pivotal Cloudfoundry集成你的应用程序5、Spring Cloud Cloud Foundry Service Broker 为建立管理云托管服务的服务代理提供了一个起点。
6、Spring Cloud Cluster 基于Zookeeper, Redis, Hazelcast, Consul实现的领导选举和平民状态模式的抽象和实现。
7、Spring Cloud Consul 基于Hashicorp Consul实现的服务发现和配置管理。
你都⽤过SpringCloud的哪些组件,它们的原理是什么?前⾔看到⽂章的题⽬了吗?就是这么抽象和笼统的⼀个问题,确实是我⾯试中真实被问到的,某共享货车平台的真实⾯试问题。
SpringCloud确实是⽤过,但是那是三四年前了,那个时候SpringCloud刚开始流⾏没多久,我们技术总监让我们调研⼀下,然后算上我在内的三个同事就⼀⼈买了⼀本SpringCloud的书籍,开始看,开始研究,正好那个时候DDD也⽐较⽕,然后我们就⼀边研究的SpringCloud⼀边按照DDD的模型搭建⾃⼰的项⽬。
但是这个项⽬最后做了三个⽉,才完成了⼀期。
后⾯⼆期还没开始,我就撤了。
所以SpringCloud总共的使⽤时间就两三个⽉,所以对这部分知识掌握的并不扎实,⽽且⼊职了新公司之后,都是使⽤公司⾃⼰封装的框架,也已经三年没有⽤过SpringCloud了,这次是要⾯试换⼯作了,所以决定将这⽅⾯的知识,总结⼀下。
服务治理 Spring Cloud Eureka我们之前在使⽤服务之间相互调⽤的时候,⼀般是靠⼀些静态配置来完成的。
⽐如服务A,要调⽤服务B来完成⼀个业务操作时,为了实现服务B的⾼可⽤,⼀般是通过⼿动配置来完成服务B的服务实例清单的维护。
随着业务的发展,系统功能越来越复杂,相应的服务不断增加,⽽且服务的IP还⼀直在变化,静态配置来维护各服务,就会变得越来越困难。
这个时候就出现了服务治理框架,Spring Cloud Eureka。
Spring Cloud Eureka 主要是围绕着服务注册与服务发现机制来完成对微服务的⾃动化管理的。
服务注册Eureka提供了服务端组件,我们也称为注册中⼼。
每个服务都向Eureka的服务注册中⼼,登记⾃⼰提供服务的元数据,包括服务的ip地址、端⼝号、版本号、通信协议等。
这样注册中⼼,就将各个服务维护在了⼀个服务清单中(双层Map,第⼀层key是服务名,第⼆层key是实例名,value是服务地址加端⼝)。
【微框架】之⼀:从零开始,轻松搞定SpringCloud微服务系列--开⼭篇(spring。
Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现Spring 顶级项⽬,包含众多,我们重点学习⼀下,SpringCloud项⽬以及SpringBoot项⽬————————————————————main————————————————————⼀、SpringCloud项⽬简介 Spring Cloud: 微服务⼯具包,为开发者提供了在分布式系统的配置管理、服务发现、断路器、智能路由、微代理、控制总线等开发⼯具包。
Spring Boot: 旨在简化创建产品级的 Spring 应⽤和服务,简化了配置⽂件,使⽤嵌⼊式web服务器,含有诸多开箱即⽤微服务功能 可以和spring cloud联合部署。
⼆、SpringCloud⼦项⽬介绍 Spring Cloud Config:配置管理开发⼯具包,可以让你把配置放到远程服务器,⽬前⽀持本地存储、Git以及Subversion。
Spring Cloud Bus:事件、消息总线,⽤于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。
Spring Cloud Netflix:针对多种Netflix组件提供的开发⼯具包,其中包括Eureka、Hystrix、Zuul、Archaius等。
Netflix Eureka:云端负载均衡,⼀个基于 REST 的服务,⽤于定位服务,以实现云端的负载均衡和中间层服务器的故障转移。
Netflix Hystrix:容错管理⼯具,旨在通过控制服务和第三⽅库的节点,从⽽对延迟和故障提供更强⼤的容错能⼒。
Netflix Zuul:边缘服务⼯具,是提供动态路由,监控,弹性,安全等的边缘服务。
Netflix Archaius:配置管理API,包含⼀系列配置管理API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。
springcould五⼤组件详解⾸先看⼀张springCloud的图⽚:⼆、简单介绍下什么是springCloud?“Spring Cloud为开发⼈员提供了快速构建分布式系统中⼀些常见模式的⼯具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。
分布式系统的协调导致了样板模式, 使⽤Spring Cloud开发⼈员可以快速地⽀持实现这些模式的服务和应⽤程序。
他们将在任何分布式环境中运⾏良好,包括开发⼈员⾃⼰的笔记本电脑,裸机数据中⼼,以及Cloud Foundry等托管平台。
” -----来⾃官⽹三、为了⽅便理解假设⼀个业务场景假设现在开发⼀个电商⽹站,要实现⽀付订单功能:流程如下–1.创建⼀个订单后,如果⽤户⽴刻⽀付了这个订单,我们需要将这个订单状态更新为(已经⽀付)2.扣减相对应的商品库存3.通知仓储中⼼,进⾏发货4.给⽤户这次购物怎加相对应的积分针对上述流程,我们需要有订单服务、库存服务、仓储服务、积分服务,整个流程的⼤体思路如下:1. ⽤户针对⼀个订单完成⽀付后,就回去找订单服务,更新订单状态2. 订单服务调⽤库存服务,完成相应的功能3. 订单服务调⽤仓储服务,完成相应的功能4. 订单服务调⽤积分服务,完成相应的功能整个过程可以如下图所⽰:四、SpringCloud核⼼组件Eureka(类似于zookeeper)⾸先考虑⼀个问题,订单服务要调⽤库存服务、仓储服务、积分服务,如何调⽤呢?答:订单服务根本不知道上述服务在哪台服务器上,所以没法调⽤,⽽Eureka的作⽤就是来告诉订单服务它想调⽤的服务在哪台服务器上,Eureka有客户端和服务端,每⼀个服务上⾯都有Eureka客户端,可以把本服务的相关信息注册到Eureka服务端上,那么我们的订单服务就可以就可以找到库存服务、仓储服务、积分服务了我们上述的业务使⽤Eureka后如下图:总结:Eurake客户端:负责将这个服务的信息注册到Eureka服务端中Eureka服务端:相当于⼀个注册中⼼,⾥⾯有注册表,注册表中保存了各个服务所在的机器和端⼝号,可以通过Eureka服务端找到各个服务五、SpringCloud核⼼组件:Feign(类似于dubbo)通过上⾯的Eureka,现在订单服务确实知道库存服务、积分服务、仓储服务在哪了,但是我们如何去调⽤这些服务呢,如果我们⾃⼰去写很多代码调⽤那就太⿇烦了,⽽SpringCloud已经为我们准备好了⼀个核⼼组件:Feign,接下来看如何通过Feign让订单服务调⽤库存服务,注意Feign也是⽤在消费者端的;订单服务:库存服务:没有底层的建⽴连接、构造请求、解析响应的代码,直接就是⽤注解定义⼀个 FeignClient接⼝,然后调⽤那个接⼝就可以了。
从零开始搭建springboot+springcloud+mybatis本地项⽬全过程(图解)记录⼀下从零开始搭建⼀个springboot+springcloud+mybatis本地项⽬的demo的过程。
纯代码⼩⽩⼀枚,若有不⾜或错误之处,欢迎⼴⼤朋友指出!开发环境准备:IDE:IntelliJ Idea 2019.3数据库:mysql 8.0.2.2SpringBoot版本:2.2.0.RELEASESpringCloud版本:Hoxton.RELEASE⼀、创建⼀个新的Idea项⽬打开Idea,单击New->File->Project,选择Maven,直接下⼀步输⼊我们的项⽬名,我这⾥起名为pam,单击Finish完成创建⼆、右键单击project下的⽗节点->New->Module,创建⼀个注册中⼼服务端的Module,输⼊⼀下名称,我这⾥以pam-server为例,直接选finish;同理再创建⼀个客户端的Module,输⼊⼀下名称,我这⾥以pam-service为例,直接选finish,结构如图所⽰:三、单击File->Settings->Maven,配置⼀下本地的maven,单击OK四、在最外层pom⽂件引⼊⼀下springboot、springcloud及mybatis的依赖。
这⾥引⼊的springboot版本为2.2.0-RELEASE,与之相对应的springcloud版本为Hoxton.RELEASE。
注意⼆者版本需要相适配,否则会启动报错。
这⾥额外引⼊了⼏个常⽤依赖,直接在maven单击⼀下刷新,仓库即可在线将所需依赖下载进去。
<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.2.0.RELEASE</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!--注册中⼼相关依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.0.4.RELEASE</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.10.0</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId><version>1.3.1.RELEASE</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-contract-stub-runner</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-contract-verifier</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-stream-test-support</artifactId><scope>test</scope></dependency><dependency><groupId>mons</groupId><artifactId>commons-lang3</artifactId><version>3.5</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency></dependencies>五、创建如图所⽰的⽬录结构:①编写注册中⼼,注册中⼼⽬录结构:编写WebApplication启动类,添加注解@EnableEurekaServer和@SpringBootApplication,我这⾥想做⼀个纯注册中⼼,不与数据库挂钩,所以增加了⼀个exclude = DataSourceAutoConfiguration.class,启动项⽬时不⾃动与数据库连接,若想让注册中⼼也连接数据库,这个exclude也可以不要。
1、S pring cloud简介按照官方的话说:Spring Cloud 为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性Token、全局锁、决策竞选、分布式会话和集群状态)操作的开发工具。
最关键的是它足够简单,一般的开发人员只需要几天时间就可以学会它的基本用法。
本教程包括7个例子和相关短文,都是最简单的用法,也是默认最基本的用法,在实际生产环境中也可以用上,当然是初步使用。
本文7个例子包括:1)一个基本的spring boot应用。
2)分布式配置管理服务端3)分布式配置管理客户端(微服务应用)4)服务注册服务端5)服务注册发现客户端(微服务应用)6)spring boot风格的web前端应用7)使用docker发布应用开源项目地址:/zhou666/spring-cloud-7simple2、使用spring boot创建一个应用Spring Boot是Spring团队推出的新框架,它所使用的核心技术还是Spring框架,主要是Spring 4.x,所以如果熟悉spring 4的人,能够更快的接受和学会这个框架。
Spring boot可以看做是在spring框架基础上再包了一层,这一层包含方便开发者进行配置管理和快速开发的模块,以及提供了一些开箱即用的工具,比如监控等。
Spring Boot官方文档有中文翻译版:https:///qibaoguang/Spring-Boot-Reference-Guide要实现一个spring boot开发环境和传统的应用没有区别,这里用的是:IDE:myeclipse 10JDK:jdk1.7WINDOWS:mvn 3在桌面windows环境里需要单独安装方便我们使用命令行进行打包和操作。
Eclipse环境里也需要安装mvn插件,当然如果使用的是myeclipse,那么自带的mvn环境就足够了。
以下是建立spring boot helloworld应用的步骤。
注意这是一个web应用,使用了嵌入式的tomcat。
1)首选建立一个最简单的maven工程,如下图:这个应用只有一个类,编写代码如下:@Controller@SpringBootApplicationpublic class SampleController {@ResponseBody@RequestMapping(value = "/")String home() {return "Hello World!";}public static void main(String[] args) throws Exception {SpringApplication.run(SampleController.class, args);}}@SpringBootApplication相当于@Configuration、@EnableAutoConfiguration和@ComponentScan,你也可以同时使用这3个注解。
其中@Configuration、@ComponentScan是spring框架的语法,在spring 3.x就有了,用于代码方式创建配置信息和扫描包。
@EnableAutoConfiguration是spring boot语法,表示将使用自动配置。
你如果下载了spring boot 源码,就会看到spring boot实现了很多starter应用,这些starter就是一些配置信息(有点类似于docker,一组环境一种应用的概念),spring boot看到引入的starter包,就可以计算如果自动配置你的应用。
2)配置pom.xml这个应用不需要配置文件,写完class后就可以直接配置pom.xml文件了,当然先配置pom.xml也一样。
Pom文件配置如下:<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>1.3.1.RELEASE</version></parent><groupId>spring.boot</groupId><artifactId>cloud-simple-helloword</artifactId><version>0.0.1</version><packaging>jar</packaging><name>cloud-simple-helloword</name><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>pom文件配置完,你就可以运行应用了,点击F11,或者在SampleController类右键“Run Java Application”就可以看到应用启动并运行了。
此时在浏览器输入http://localhost:8080/,你会看到helloworld字样,这是一个web应用,使用了嵌入式的tomcat。
在pom配置中我们仅仅使用了spring-boot-starter-web依赖,spring boot会根据此依赖下载相关jar包并初始化基本的运行环境,比如说绑定端口8080等。
spring boot封装所有配置信息为键值类型,你想改变默认配置,只需要向应用传入这个键值对就可以,比如我们想改变绑定端口为8081,那么你在main方法里传入“—server.port=8081”即可,或者干脆使用:SpringApplication.run(SampleController.class, "--server.port=8081");3)部署spring boot应用要部署运行spring boot应用,首选要打包spring boot应用,你在pom文件中看到的spring-boot-maven-plugin 插件就是打包spring boot应用的。
进入工程目录运行mvn package,如:D:\cloud-simple-helloword>mvn package打包过后就可以进入target目录使用java原生命令执行这个应用了。
D:\cloud-simple-helloword\target>java -jar cloud-simple-helloword-0.0.1.jar --server.port=8081如此,你就看到一个基于jar包的web应用启动了。
Spring boot提供的一些开箱即用的应用非常容易使用,比如监控,你只需要在pom文件中引入:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>引入之后,spring boot是默认开启监控的,运行应用你可以在浏览器中输入:http://localhost:8080/health就可以看到默认的监控信息了:{"status":"UP","diskSpace":{"status":"UP","total":161067397120,"free":91618398208,"threshold":10485760}}信息包括程序执行状态以及基本的磁盘信息。
3、使用spring cloud实现分布式配置管理本文涉及到的项目:cloud-config-repo:配置文件存放的文件夹cloud-simple-service:一个使用mybatis的数据库应用分布式配置管理应该是分布式系统和微服务应用的第一步。
想象一下如果你有几十个服务或应用需要配置,而且每个服务还分为开发、测试、生产等不同维度的配置,那工作量是相当大的,而且还容易出错。
如果能把各个应用的配置信息集中管理起来,使用一套机制或系统来管理,那么将极大的提高系统开发的生产效率,同时也会提高系统开发环境和生产环境运行的一致性。
在传统开发中我们往往需要自己开发“配置管理服务器”,你可以使用redis、ldap、zookeeper、db等来存放统一配置信息,然后开发一个管理界面来进行管理。
传统的做法没什么问题,和spring cloud所提供的配置管理方案相比,就是前者需要自己开发,而后者直接简单使用现成的组件即可。
当然还有很重要的一点,spring 配置管理模块由于是spring boot核心来实现的,因此做了大量的工作,可以把一些启动参数进行外部配置,这在传统的方案中是很难办到的,因为涉及到要改写第三方组件的问题,难度很大。