一、简单理解
其实微服务本身并不复杂,就我学习几天的理解,微服务最大的作用还是解耦。将大的应用分解为若干个互不干扰的模块。每个模块都可以独立运行和部署。既然模块都可以独立部署,那么每一个模块就都可以看作一个单体应用,也称为一个服务。那么传统的单体应用后台能做什么,那一个微服务同样也可以,比如分布式部署。
刚刚说微服务本身不复杂,其中肯定有复杂的部分。比如数据同步之类的。。(我还没学到,之后再补充)
二、注册中心与服务注册
- 注册中心本身也是一个服务,只不过它的职责相对特殊。
- 在微服务的应用中,所有的服务都会注册到注册中心。
那么为什么需要注册中心这个东西呢?
其实还是为了解耦,上面说了,每一个服务都是一个独立的应用。如果应用A要调用应用B的接口,那么必然需要知道B接口的调用地址。但是如果这时候应用B的负载变大,需要分布式部署或者B需要改变部署位置。那么所有调用B应用接口的地址都需要改变。这显然是强耦合的。
而注册中心就解决了这个问题。当B服务注册到注册中心后,注册中心会保存此次注册的服务地址,当其他服务需要调用B服务的接口,只需要从服务中心获取就行了。而且已经注册的服务会每30秒向注册中心发送一次心跳信息,以及一些其他的操作,这里就不详细展开了。到这里就显而易见了,服务中心的主要功能就是为已注册的服务提供其他服务的最新地址。
服务注册
在视频里,举了生产者与消费者的例子,相对比较简单。在现实中,在作为生产者的同时可能也是消费者,反之亦然。
在微服务架构中想要做到某服务的负载均衡也十分方便,只需要将同一个服务部署到不同的环境,并将它们在注册中心注册,在调用服务时均衡调用也就做到了负载均衡。
RestTeamplate
一个方便发送http请求的实现类。
这个类并非spring cloud中提供,而是spring提供的。只是在单体应用中很少有后端发送http请求的需求。
其中有一些点需要注意,
在使用restTemplate.postForObject
方法发送请求时。
可以使用key/value的形式传递,但是必须使用MultiValueMap
类型的map,否则会接收不到数据。(稍微看了下源码,还没定位到原因)
还可以使用json的形式传递,spring boot会将对象序列化为json。
restTemplate.postForObject
("http://provider/helloPostJson", user, User.class);
需要注意的是,如果使用这种方式发送请求,接口参数需要加上@RequestBody
注解。
三、负载均衡
在spring cloud中实现负载均衡十分容易,只需要在RestTemplate
方法上添加@LoadBalanced
注解即可。在添加注解之后,普通的请求工具就自动具备了负载均衡的功能。
总体来说,过程是这样的:
- 从Eureka Client本地缓存的服务注册信息列表中,选择一个可以调用的服务。挑选的方式,取决于负载均衡策略的配置。默认是线性负载均衡。
- 根据步骤一中挑选的服务,重构URL地址
- 将步骤一、二嵌入到RestTemplate中