第三章:SpringCloud 快速开发入门

3-1. 搭建和配置一个服务提供者

我们知道,SpringCloud 构建微服务是基于 SpringBoot 开发的

  • 1. 创建一个 SpringBoot 工程,并且添加 SpringBoot 的相关依赖
  • 2. 创建服务提供者的访问方法,也就是后续消费者如何访问提供者

Spring Cloud 是基于 rest 的访问,所以我们添加一个 Controller,在该 Controller 中提供一个访问入口:  
 

@RestController
public class HelloController {
    @RequestMapping(value = "/hello", method = RequestMethod.GET) 
    public String hello() {
        return "Hello Spring Cloud";
    }
}
  • 3. 启动运行该 SpringBoot 程序,访问该 controller

 3-2. 搭建和配置一个服务消费者

服务消费者也是一个 SpringBoot 项目,服务消费者主要用来消费服务提供者提供的服务

  • 1. 创建一个 SpringBoot 工程,并且添加 SpringBoot 的相关依赖
  • 2. 开发一个消费者方法,去消费服务提供者提供的服务,这个消费者方法也是一个 Controller
@RestController
public class ConsumerController {
    @Autowired
    private RestTemplate restTemplate;
    
    @RequestMapping(value = "/cloud/hello")
    public String helloController() {
        return restTemplate.getForEntity("http://localhost:9100/hello", String.class).getBody();
    }
}
  • 3. 启动该 SpringBoot 程序,测试服务消费者调用服务提供者

3-3. 走进服务注册中心 Eureka

在微服务架构中,服务注册与发现是核心组件之一,手动指定每个服务是很低效的,Spring Cloud 提供了多种服务注册与发现的实现方式,例如:Eureka、Consul、Zookeeper。   Spring Cloud 支持得最好的是 Eureka,其次是 Consul,再次是 Zookeeper。

什么是服务注册?

服务注册:将服务所在主机、端口、版本号、通信协议等信息登记到注册中心上

什么是服务发现?

服务发现:服务消费者向注册中心请求已经登记的服务列表,然后得到某个服务的主机、端口、版本号、通信协议等信息,从而实现对具体服务的调用

 Eureka 是什么?

  • Eureka 是一个服务治理组件,它主要包括服务注册和服务发现,主要用来搭建服务注册中心
  • Eureka 是一个基于 REST 的服务,用来定位服务,进行中间层服务器的负载均衡和故障转移
  • Eureka 是 Netflix 公司开发的,Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现,也就是说 Spring Cloud 对 Netflix Eureka做了二次封装
  • Eureka 采用了 C-S(客户端/服务端)的设计架构,也就是 Eureka 由两个组件组成:Eureka 服务端和 Eureka 客户端。Eureka Server 作为服务注册的服务端,它是服务注册中心,而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server 服务端,并维持心跳连接,Eureka 客户端是一个 Java 客户端,用来简化与服务器的交互、负载均衡,服务的故障切换等

有了 Eureka 注册中心,系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行

3-4. Eureka 与 Zookeeper 的比较

著名的 CAP 理论指出,一个分布式系统不可能同时满足 C(一致性)、A(可用性)和 P(分区容错性)

由于分区容错性在是分布式系统中必须要保证的,因此我们只能在 A 和 C 之间进行权衡,在此 Zookeeper 保证的是 CP, 而 Eureka 则是 AP。

Zookeeper 保证 CP

在 ZooKeeper 中,当 master 节点因为网络故障与其他节点失去联系时,剩余节点会重新进行 leader 选举,但是问题在于,选举 leader 需要一定时间, 且选举期间整个 ZooKeeper 集群都是不可用的,这就导致在选举期间注册服务瘫痪。在云部署的环境下,因网络问题使得 ZooKeeper 集群失去 master 节点是大概率事件,虽然服务最终能够恢复,但是在选举时间内导致服务注册长期不可用是难以容忍的

Eureka 保证 AP

Eureka 优先保证可用性,Eureka 各个节点是平等的,某几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而 Eureka 的客户端在向某个 Eureka 注册或时如果发现连接失败,则会自动切换至其它节点,只要有一台 Eureka 还在,就能保证注册服务可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)。

所以 Eureka 在网络故障导致部分节点失去联系的情况下,只要有一个节点可用,那么注册和查询服务就可以正常使用,而不会像 zookeeper 那样使整个注册服务瘫痪,Eureka 优先保证了可用性

 3-5. 搭建与配置 Eureka 服务注册中心

Spring Cloud 要使用 Eureka 注册中心非常简单和方便,Spring Cloud 中的Eureka 服务注册中心实际上也是一个 Spring Boot 工程,我们只需通过引入相关依赖和注解配置就能让 Spring Boot 构建的微服务应用轻松地与 Eureka 进行整合

具体步骤如下:

  • 1.  创建一个 SpringBoot 项目,并且添加 SpringBoot 的相关依赖(03-springcloud-eureka-server)
  • 2.  添加 eureka 的依赖
<!--Spring Cloud的eureka-server起步依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--spring-boot-starter-parent 没有eureka的版本信息-->
<!--加入cloud依赖管理-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<!--maven中心没有-->
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/libs-milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
  • 3. 在Spring Boot的入口类上添加一个@EnableEurekaServer注解,用于 开启Eureka注册中心服务端 
  • 4.  在application.properties文件中配置Eureka服务注册中心信息 
#内嵌定时tomcat的端口
server.port=8761

#设置该服务注册中心的hostname
eureka.instance.hostname=localhost

#由于我们目前创建的应用是一个服务注册中心,而不是普通的应用,默认情况下,这个应用会向注册中心(也是它自己)注册它自己,设置为false表示禁止这种自己向自己注册的默认行为
eureka.client.register-with-eureka=false

#表示不去检索其他的服务,因为服务注册中心本身的职责就是维护服务实例,它不需要去检索其他服务
eureka.client.fetch-registry=false

#指定服务注册中心的位置
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka

3-6. 启动与测试 Eureka 服务注册中心 

  • 1. 完成上面的项目搭建后,我们就可以启动SpringBoot程序,main方法运行
  • 2. 启动成功之后,通过在浏览器地址栏访问我们的注册中心

3-7. 向 Eureka 服务注册中心注册服务 

01-springcloud-service-provider

我们前面搭建了服务提供者项目,接下来我们就可以将该服务提供者注册到 Eureke注册中心

步骤如下:

  • 1. 在该服务提供者中添加 eureka 的依赖,因为服务提供者向注册中心注册服务,需要连接eureka,所以需要eureka客户端的支持
<!--SpringCloud集成eureka客户端的起步依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

@EnableEurekaClient注解来表明自 己是一个eureka客户端,让我的服务提供者可以连接eureka注册中心

3. 配置服务名称和注册中心地址 

#服务提供者的内嵌tomcat端口
server.port=9100

#配置服务的名称
spring.application.name=01-springcloud-service-provider

#eureka的连接地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
  • 4. 启动服务提供者SpringBoot程序的main方法运行
  • 5. 启动运行之后,通过在浏览器地址栏访问我们之前搭建好的 eureka 注册中 心,就可以看到有一个服务已经注册成功了

springcloud开发需要什么样的电脑 springcloud开发流程_spring

 

3-8. 从 Eureka 服务注册中心发现与消费服务 

我们已经搭建一个服务注册中心,同时也向这个服务注册中心注册了服务,接下 来我们就可以发现和消费服务了,这其中服务的发现由eureka客户端实现,而 服务的消费由Ribbon实现,也就是说服务的调用需要eureka客户端和Ribbon两者配合起来才能实现

Eureka客户端是什么?

Eureka客户端是一个Java客户端,用来连接Eureka服务端,与服务端进行交互、负载均衡,服务的故障切换等

Ribbon是什么?

Ribbon是一个基于HTTP 和 TCP 的客户端负载均衡器,当使用Ribbon对服 务进行访问的时候,它会扩展 Eureka 客户端的服务发现功能,实现从 Eureka 注册中心中获取服务端列表,并通过Eureka客户端来确定服务端是否己经启动。 Ribbon 在 Eureka 客户端服务发现的基础上,实现了对服务实例的选择策略, 从而实现对服务的负载均衡消费

接下来我们来让服务消费者去消费服务:

02-springcloud-service-consumer

我们前面搭建了服务消费者项目,接下来我们就可以使用该服务消费者通过注册 中心去调用服务提供者,步骤如下:

  • 1. 在该消费者项目中添加 eureka 的依赖,因为服务消费者从注册中心获取服 务,需要连接eureka,所以需要eureka客户端的支持
<!--SpringCloud集成eureka客户端的起步依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  • 2. 激活Eureka中的EnableEurekaClient功能: 在Spring Boot的入口函数处,通过添加@EnableEurekaClient注解来表明自 己是一个eureka客户端,让我的服务消费者可以使用eureka注册中心;
  • 3. 配置服务的名称和注册中心的地址
server.port=8081

#配置服务的名称
spring.application.name=02-springcloud-service-consumer

#配置eureka注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
  • 4. 前面我介绍了服务的发现由eureka客户端实现,而服务的真正调用由ribbon 实现,所以我们需要在调用服务提供者时使用ribbon来调用 
@LoadBalanced  //使用Ribbon实现负载均衡的调用
@Bean//bean的id就是方法名
public RestTemplate restTemplate() {
    return new RestTemplate();
}

 加入了ribbon的支持,那么在调用时,即可改为使用服务名称来访问: 

return restTemplate.getForEntity("http://01-SPRINGCLOUD-SERVICE-PROVIDER/service/hello", String.class).getBody();
  • 5. 完成上面的步骤后,我们就可以启动消费者的SpringBoot程序,main方法 运行
  • 6. 启动成功之后,通过在浏览器地址栏访问我们的消费者,看是否可以正常调 用远程服务提供者提供的服务

springcloud开发需要什么样的电脑 springcloud开发流程_服务提供者_02

springcloud开发需要什么样的电脑 springcloud开发流程_服务提供者_03