SpringCloud就是分布式微服务架构的一站式解决方案,是微服务架构落地的多种技术的集合。
目录
[搭建Eureka Server](#搭建Eureka Server)
当各种各样的服务越来越多,拆分的也越来越细,此时就会出现一个服务集群。

但是这么多服务,只靠人来管理是不现实的,所以引入了注册中心。

但是每个微服务都需要有不同的配置,我们就需要一个配置中心来管理每个服务的配置文件。

但是还需要管理用户的id,访问之类的事情,就需要一个服务网关。

光有了这些,还需要存储数据的数据库,并且还需要搭配分布式的缓存和搜索。
还需要消息队列来管理服务集群之间的通信。

一直到最后,才完成了整个微服务的整体架构。

微服务远程调用
现在我们有两个微服务(此处看做是两个springboot项目,各自有各自的端口和配置,数据库不是公用的,通过父子关系把一些配置公有化了)。我们需要在一个微服务中,把另一个微服务的接口调用到,该怎么做?
这里是有两个数据库,每个微服务只能查询到自己数据库的内容。我们通过Order模块里面的内容是无法查询到User中的信息的。

对于User服务,在Mapper中有一个GetMapper方法,只需要给它发送请求,它就会返回一个信息出来。于是我们就可以在Order中,也给它发送一个这个请求来获得数据库的信息。并且这个请求是解耦的,并不依赖于某个模块。

注册RestTemplate
一般来说,配置类是Controller,此处的Application也可以作为配置类。我们就直接把RestTemplate注册到Spring中。

在Order中,订单查询功能,是没有用户信息的。用户信息在另一个数据库中,此处查询不到。但是,Order中有用户的ID,通过这个ID可以在另一个数据库中查询到我们想要的结果。
通过restTemplate就能直接给另一个接口发送信息,接收到信息后再整合进原来的order中。


Eureka注册中心
在上述的例子中,远程调用的时候,我们的URL是写死的。当更换机器,或者新增机器的时候,这个URL就需要跟着变更。这样就需要通知所有的相关服务去修改。各个项目的配置文件反复更新,各个项目部署非常频繁。
引入Eureka注册中心,就可以帮助我们完成这一系列的操作。

- EurekaServer:作为注册中心Server端,向微服务应用程序提供服务注册,发现,健康检查等能力。
- EurekaClient:服务提供者,服务启动时,会向EurekaServer注册自己的信息(IP,端口,服务信息等),Eureka Server 会存储这些信息。
搭建Eureka Server
新建一个模块,并且选择好Maven

在eureka的pom文件中,配置好相关的信息。

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
给该项目编写⼀个启动类,并在启动类上添加服务@EnableEurekaServer 注解,开启eureka注册中心。

配置好相关的配置文件。

启动服务,并且可以访问到eureka的网页。红框框就是被注册的组件。

注册组件
针对user-service,我们注册这个组件到Eureka有两个步骤:
引入pom依赖

修改yml配置文件

注意,这里的配置文件修改极其容易出错,请严格注意格式!
对于order-dervice,步骤是一样的。重启服务,在Eureka的网页中就可以看到两个组件被注册成功。

服务拉取
刚刚是两个组件的情况,如果我们想要开两个服务,可以直接在IDEA里面添加。添加完成后,就会有两个只有端口不同的服务在一起。


现在我们通过order-service完成服务拉取,拉取的内容是user-service中的。
-
修改OrderService的代码,修改访问的url路径,用服务名称代替ip和端口
javaString url = "http://userservice/user/" + order.getUserId();
-
在order-service项目的启动类OrderApplication中的RestTemplate添加负载均衡注释
这样子,刚刚我们启动的两个UserApplication,会在收到请求的时候通过负载均衡,动态的控制服务器响应给OrderService。
在地址栏快速的访问127.0.0.1:8080/order/101 和 127.0.0.1:8080/order/102 可以发现这两次请求是在不同的实例上完成的。


搭建 Eureka Server
- 引入
eureka-server
依赖。 - 添加
@EnableEurekaServer
注解。 - 在
application.yml
中配置 Eureka 地址。
服务注册
- 引入
eureka-client
依赖。 - 在
application.yml
中配置 Eureka 地址。
服务发现
- 引入
eureka-client
依赖。 - 在
application.yml
中配置 Eureka 地址。 - 给
RestTemplate
添加@LoadBalanced
注解。 - 用服务提供者的服务名称远程调用。
这就是通过Eureka注册中心完成服务注册的流程了。只有同一个服务多个实例才能做负载均衡。那么具体讲到负载均衡,我们下一章节再详细说~