第三章 Spring Cloud 快速开发入门

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

我们知道,Spring Cloud 构建微服务是基于Spring Boot开发的。

  • 创建一个Spring Boot工程,并且添加Spring Boot的相关依赖
  • 创建一个服务提供者的访问方法,也是后期消费者如何访问提供者

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

@RestController
public class ProviderController{
    @RequestMapping(value="/hello",method=RequestMethod.GET)
    public String hello(){
		return "hello world";        
    }
}
  • 启动运行该SpringBoot程序,访问该Controller

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

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

  • 创建一个SpringBoot 工程,并添加SpringBoot的相关依赖
  • 开发一个消费者方法,去消费服务提供者消费的服务,这个消费方法也是一个Controller
@RestController
public class ConsumerController{
    @Autowired
    private RestTemplate restTemplate;
    
    
    @RequestMapping(value="/web/hello",method=RequestMethod.GET)
    public String hello(){
		// 调用服务提供者提供过的服务
        return restTemplate
            .getForEntity("http://localhost:8080/service/hello",String.class)
            .getBoby();
    }
}
  • 启动该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进行整合。

​    具体步骤如下:

  • 创建一个Spring Boot项目,并且添加Spring Boot的相关依赖。
  • 添加Eureka的依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    <version>2.0.2.RELEASE</version>
</dependency>

<!-- 指定Spring 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>

<!--Spring Cloud 的仓库 -->
<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>
  • 在Spring Boot的入口类上添加一个@EnableEurekaServer注解,用于开启Eureka注册中心服务端。
  • 在application.properties文件中配置Eureka服务注册中心信息
server.port=8888
#设置服务注册中心的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服务注册中心

  • 完成上面的项目搭建后,我们可以通过启动SpringBoot程序运行。
  • 启动成功后,通过浏览器地址栏访问我们的注册中心。

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

  • 在服务提供者中添加Eureka的依赖,因为提供服务需要连接Eureka,所以需要Eureka的客户端支持
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <version>2.0.2.RELEASE</version>
</dependency>
  • 激活Eureka的EnableEurekaClient功能
    • 在入口函数中,通过添加@EnableEurekaClient注解来表明自己是一个Eureka客户端,让我们服务提供者可以连接到Eureka注册中心
  • 配置服务名称和注册中心地址
server.port=9100
spring.application.name=spring-cloud-serivce-provider
eureka.client.service-url.defaultZone=http://localhsot:8888/eureka
  • 启动运行服务提供者SpringBoot程序
  • 启动运行后,通过浏览器地址访问我们之间搭建好的eureka注册中心,就可以看到有一个服务已经注册成功

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

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

  • Eureka客户端是什么?

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

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

    • 服务消费者项目中添加eureka客户端依赖

      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
          <version>2.0.2.RELEASE</version>
      </dependency>
      
    • 激活Eureka的EnableEurekaClient功能

      • 在入口函数中,通过添加@EnableEurekaClient注解来表明自己是一个Eureka客户端,让我们服务消费者可以连接到Eureka注册中心
    • 配置服务名称和注册中心地址

    server.port=9200
    spring.application.name=spring-cloud-service-consumer
    eureka.client.service-url.defaultZone=http://localhsot:8888/eureka
    
    • 使用ribbon来调用服务

       @LoadBalanced // 负载均衡注解
       @Bean
       public RestTemplate restTemplate(){
           return new RestTemplate();
       }
      
       @RestController
       public class ConsumerController{
           @Autowired
           private RestTemplate restTemplate;
           
           
           @RequestMapping(value="/web/hello",method=RequestMethod.GET)
           public String hello(){
       		// 调用服务提供者提供过的服务
               return restTemplate.getForEntity("http://spring-cloud-serivce-provider/service/hello",String.class)
                  				   .getBoby();
           }
       }
      
    • 完成上面步骤之后,启动消费者程序。 通过地址栏访问我们的消费者,看是否正常调用远程服务这提供的服务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值