代码地址https://github.com/springcloud-demo

目录

第一章 微服务介绍

1.1 经典架构

1.2 单体应用架构

1.3 基于ajax的前后端分离

1.4 分布式架构

1.5 微服务架构

1.6 SpringCloud是什么

第二章 服务注册与发现

2.1 Spring Cloud Eureka

2.2 Eureka Server注册中心

2.3 Eureka Server实践

2.3.1 创建项目

2.3.2 启动项目

2.3.3 隐藏注册中心,修改端口

2.4 Eureka Client服务注册

2.4.1 创建应用

2.4.2 配置启动应用

2.5 Eureka高可用

2.6 分布式下服务注册的地位和原理


第一章 微服务介绍

微服务的提出:

springcloud endpoint 作用 springcloud常见功能_微服务

 微服务是一种架构风格,比如restful也就是一种架构风格,既然是一种风格,也就是没有强制性,没有绝对标准的答案,细节上会有很多不同的理解.

springcloud endpoint 作用 springcloud常见功能_微服务_02

1.1 经典架构

springcloud endpoint 作用 springcloud常见功能_微服务_03

1.2 单体应用架构

1.所有的功能都是打包在一个var包里的.基本没有web依赖(不是maven里的dependency),而是商品服务依赖订单服务这样的依赖,我们现在打包成一个war包,商品与订单都在一个整体里,所以没依赖

2.部署在一个tomcat容器中,包括service,dao,ui所有逻辑.

3.所有服务公用一个db.

优点:容器测试,容易部署

缺点:开发效率低,代码维护难.部署不灵活(部署时间长,构建项目不灵活),稳定性不高.扩展性不够(希望商品服务应对的流量大一些,订单服务应对的流量少一些)

1.3 基于ajax的前后端分离

springcloud endpoint 作用 springcloud常见功能_spring_04

 

springcloud endpoint 作用 springcloud常见功能_Cloud_05

1.4 分布式架构

分布式定义:

springcloud endpoint 作用 springcloud常见功能_微服务_06

分布式与集群的区别:厨房里有两个厨师,一个切菜,一个炒菜,这个叫分布式.两个都炒菜,这个叫集群.

1.5 微服务架构

springcloud endpoint 作用 springcloud常见功能_spring_07

前端服务与后端服务都是可以集群化的,前端后端都要向服务注册发现进行注册.

服务注册发现:服务提供方必须注册上来,服务的调用方才能从组件上正确的发现目标服务.

服务网关:微服务除了内部相互通信,也需要让外界访问得到.比如手机与浏览器之类的,所以需要通过一种方式将自己的路由暴露出去,这就涉及到服务的前端路由,对应的组件是服务网关,它是连接内外的大门.网关会对外屏蔽后台的一些细节,路由的功能,限流和容错的功能,和可以堆服务网关进行认证,反爬虫等等,看一个公司的项目好不好,看服务网关就行了.

后端通用服务:在启动的时候会将服务注册到服务注册表里面.

前端服务:前端服务可以查询注册表,调用后端服务.前端的服务对后端的服务做聚合和必要的裁剪后,暴露给外部不同的设备.

聚合就是对多个api调用逻辑进行聚合,比如客户端来请求两个api,一个api是获取用户的基本信息,一个api是获取用户的地址,前端的服务可以将两个接口合二为一,这样客户端只用调用一个接口就好了.

裁剪就是都是返回商品信息的接口,pc端返回的更详细一些,手机端返回的更简单一些.还有就是比如我们pc端要返回html.手机端要返回报文,这个时候也是由前端服务做的裁剪的操作.

可以看到上面的后端通用服务于前端服务都有些"胖",如和治理呢?

两大解决方案:

阿里系:

Dubbo做服务化治理

ZooKeeper做服务注册中心

SpringCloud:

Spring Cloud Netflix Eureka

1.6 SpringCloud是什么

springcloud endpoint 作用 springcloud常见功能_SpringCloud_08

 

第二章 服务注册与发现

2.1 Spring Cloud Eureka

两个组件组成:

Eureka Server 供服务注册的服务器,服务注册中心

Eureka Client 用来简化与服务器的交互,作为轮询负载均衡器,并提供服务的切换支持.系统中的其它微服务使用Client连接到server,并维持心跳连接,这就就能监控系统中各个微服务是否正常运行.

2.2 Eureka Server注册中心

注册中心好比老师手中的名单,上面记录了班里所有同学的名字,在他要点名的时候就掏出名单,到了微服务这里注册中心也是类似的,它记录着所有应用信息和状态,应用叫什么名字,在哪台服务器上,目前是否正常工作.在微服务架构里,我们习惯将应用称作服务.

eureka的英文意思是找到了,有了的意思,注册中心提供的就是服务的注册与发现,与单词的意思温和.

2.3 Eureka Server实践

2.3.1 创建项目

新建项目,配置为图1所示,如果担心eureka版本与springboot版本不匹配可以去官网的的springcloud项目下去查找,对应版本,即https://spring.io/projects/spring-cloud此网页拉到最下面如图2所示.


springcloud endpoint 作用 springcloud常见功能_Cloud_09

图1

 


springcloud endpoint 作用 springcloud常见功能_Cloud_10

图2

2.3.2 启动项目

创建好项目后在application中增加@EnableEurekaServer即可启动项目.有报错先不用管.

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaApplication.class, args);
	}

}

启动后访问localhost:8080访问项目主页,也就是注册中心.

DS Replicas表示server端有哪些应用.刚打开是只有一个localhost应用的.

Instances currently registered with Eureka表示当前注册中心的一些应用.

General Info表示系统的一些信息.其中的registered-replicas表示的是注册地址.默认的是localhost8761端口.

解决报错问题:可以看到一直在报错,这是因为我们的应用虽然是server端,但是同时它也是一个client端,它也需要找一个注册中心将自己注册进去.可以看EnableEurekaServer的源代码,为了使其不报错,我们在application.properties中配置一下注册地址,让它往自己身上注册.并配置名字为eureka

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(EurekaServerMarkerConfiguration.class)
public @interface EnableEurekaServer {

}
eureka.client.service-url.defaultZone = http://localhost:8761/eureka/
spring.application.name=eureka

重新启动项目,可以看到项目成功启动不再一直报错,但是中间会有一两个报错,这个不用管,因为应用既是server,又是client,client启动好就去请求没请启动好的server,就会报错,client请求使用的是心跳机制,即隔一会儿就去请求server,所以等server启动好就不会报错了.

再次访问,可以看到已经注册成功了.

springcloud endpoint 作用 springcloud常见功能_spring_11

2.3.3 隐藏注册中心,修改端口

我们的应用本来就是注册中心,所以不应该在注册应用上,我们可以按图3所示隐藏,因为一些别的项目端口也可能是8080,我们将注册地址以及项目地址都改为8761,下面是总的配置.


springcloud endpoint 作用 springcloud常见功能_spring_12

图3

eureka.client.service-url.defaultZone = http://localhost:8761/eureka/
spring.application.name=eureka
server.port=8761
eureka.client.register-with-eureka=false

2.4 Eureka Client服务注册

2.4.1 创建应用

springcloud endpoint 作用 springcloud常见功能_Cloud_13

2.4.2 配置启动应用

增加注解

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
	public static void main(String[] args) {
		SpringApplication.run(EurekaApplication.class, args);
	}
}

增加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

增加注册位置,即要把client注册到哪个地址,同时配置名字

eureka.client.service-url.defaultZone = http://localhost:8761/eureka/
spring.application.name=client

启动应用,显示图4则配置成功.


springcloud endpoint 作用 springcloud常见功能_SpringCloud_14

图4

注意到有红字警告,因为server端与client端采用的是心跳的机制,server端会不停的去检查client到底是否上线,会在一定时间统计出上线率就是一个比率,当它低于某个比率是则会弹出下面的警告.表明client上线率较低,现在不知道到底有没有上线,那么怎么 办呢?我就当作你是上线,就是宁可信其有不可信其无.

springcloud endpoint 作用 springcloud常见功能_spring_15

 在开发环境我们可以将其关闭,避免在将来调用微服务时,上面显示在线其实已经下线.在eureka项目的配置文件中加上如下,重启项目即可.

eureka.server.enable-self-preservation=false

再次打开显示如下,意思是自我保护模式已经关闭,建议你不要关闭.

springcloud endpoint 作用 springcloud常见功能_SpringCloud_16

注意:

eureka.client.register-with-eureka=fasle
//在开发环境中要关闭

2.5 Eureka高可用

注:我这里因为端口通过-Dserver修改不了,所以没自己实验,主要是靠视频上的讲解.

server是可能挂掉的,所以我们要配置多个eureka实现高可用.

在本身的eureka项目增加一个eureka的配置.两个eureka配置如下.

springcloud endpoint 作用 springcloud常见功能_Cloud_17

 

springcloud endpoint 作用 springcloud常见功能_Cloud_18

并设置eureka1在eureka2注册,eureka2在eureka1注册.

eureka1:

eureka.client.service-url.defaultZone = http://localhost:8762/eureka/

eureka2:

eureka.client.service-url.defaultZone = http://localhost:8761/eureka/

client的配置:

eureka.client.service-url.defaultZone = http://localhost:8761/eureka/

启动两个eureka,发现虽然client只向eureka1注册,但是在eureka2中也注册了client.

但是如果eureka1挂掉了,那样client就注册不上去了,我们只需要让client向两个eureka注册就行了,如下:

eureka.client.service-url.defaultZone = http://localhost:8761/eureka/,http://localhost:8762/eureka/

如果是三个eureka,可以这样:

springcloud endpoint 作用 springcloud常见功能_微服务_19

eureka1的配置:

eureka.client.service-url.defaultZone = http://localhost:8762/eureka/,http://localhost:8763/eureka/

eureka2的配置:

eureka.client.service-url.defaultZone = http://localhost:8761/eureka/,http://localhost:8763/eureka/

eureka3也类似. 

client的配置:

eureka.client.service-url.defaultZone = http://localhost:8761/eureka/,http://localhost:8762/eureka/,http://localhost:8763/eureka/

以后生产环境这么部署开发环境我们还是部署一个简单的来.

2.6 分布式下服务注册的地位和原理

分布式系统中为什么需要服务注册发现?

有A,B两个系统,如果A,B都只有一个IP,那么互相写进配置里就可以了.

如果B不多,比如只有三个那么我们还可以一个一个写进A里

springcloud endpoint 作用 springcloud常见功能_微服务_20

如果B有一百个,一千个,那就不好写进配置里了,更何况现在B不仅多,而且数目还会变,它会根据流量的大小调整服务的数量,流量少机器就少,流量多机器就多,而且机器有时候还会挂掉,所以机器的数量是可变的,

springcloud endpoint 作用 springcloud常见功能_微服务_21

所以我们需要一个注册中心,B启动的时候就会把自己的信息上报到注册中心去.这时候A要调用B就去服务中心取信息就行了.分布式系统中,注册中心是最重要的基础部分,随时都应该处于提供服务的状态,无论是否使用eureka,分布式系统中承担这块职责的组件都应该是高可用的.因为这部分如果挂了,所有的服务也就变成了无头苍蝇.

springcloud endpoint 作用 springcloud常见功能_SpringCloud_22

A如何从这么多B中挑选出来一个呢?

有两种方法:

第一种:A直接来找注册中心,注册中心将B中的服务信息全部告诉A,A通过某种机制从比如轮询,随机,哈希等负载均衡的机制从众多可用的B里挑出来一个,然后再通过IP地址去找到B,这种方式叫做客户端发现.

第二种:这种方式出现了一个新的角色叫做代理,代理帮A从众多可用的代理里面挑选一个出来,然后A再去找B,这种方式叫做服务端发现.

客户端发现的优缺点:简单直接,不需要代理的介入,同时客户端知道所有可用的服务的实际地址,缺点就是A服务要自己实现一套逻辑将B挑出来.

服务端发现的优缺点:由于代理的介入,B和注册中心对A是透明不可见的.

springcloud endpoint 作用 springcloud常见功能_微服务_23

微服务的特点:异构,各个服务间可以用不同的语言,不同类型的数据库.都可以注册到注册中心区.

SpringCloud的服务调用方式:REST,eureka服务端提供了较为完善的restApi,eureka也支持将非java语言实现的服务纳入到自己的服务体系中,只需要其它语言实现自己的客户端程序.比如Node.js的eureka-js-client.

理解分布式,架构的特点,原理更重要.