基于Spring Cloud的微服务构建学习-3 服务治理:S

  • 服务治理->搭建服务注册中心

基于Spring Cloud的微服务构建学习-3 服务治理:Spring Cloud Eureka

    服务治理可以说是微服务架构中最为核心和基础的模块, 它主要用来实现各个微服务 实例的自动化注册与发现。 为什么我们在微服务架构中那么需要服务治理模块呢?微服务 系统没有它会有什么不好的地方吗?

什么是服务治理

  服务治理可以说是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册与发现。

    在最初开始构建微服务系统的时候可能服务并不多, 我们可以通过做一些静态配置来 完成服务的调用。 比如,有两个服务 A 和 B, 其中服务 A 需要调用服务 B 来完成一个业务 操作时, 为了实现服务 B 的高可用, 不论采用服务端负载均衡还是客户端负载均衡, 都需 要手工维护服务 B 的具体实例清单。 但是随着业务的发展, 系统功能越来越复杂, 相应的 微服务应用也不断增加, 我们的静态配置就会变得越来越难以维护。 并且面对不断发展的业务, 我们的集群规模、 服务的位置 、 服务的命名等都有可能发生变化, 如果还是通过手 工维护的方式, 那么极易发生错误或是命名冲突等问题。 同时, 对于这类静态内容的维护 也必将消耗大量的人力。

为什么需要服务治理模块

  在最初构建微服务系统的时候可能服务并不多,我们可以通过做一些静态配置来完成服务调用

威尼斯人棋牌 1威尼斯人棋牌,此时看着一切都还正常。

随着项目逐渐接近尾声,维护人员需要维护的服务越来越多,越来越复杂,最终形成大量的配置文件,维护将会变得越来越困难。此时,微服务应用实例自动化管理框架变得至关重要。

    为了解决微服务架构中的服务实例维护问题, 产生了大量的服务治理框架和产品。 这 些框架和产品的实现都围绕着服务注册与服务发现机制来完成对微服务应用实例的自动化管理。

服务治理框架需要完成什么任务

  • 服务注册:在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机与端口号、版本号、通信协议等一些附加信息告知注册中心,注册中心按服务名分类组织服务清单。

威尼斯人棋牌 2

  • 服务发现:我们的所有服务都已经注册到注册中心,并且在注册中心是按照服务名分类,并且由注册中心维护者服务的具体位置。所以调用方需要调用某个服务时,需要先和注册中心咨询,注册中心会返回被调用方服务的所有具体位置,调用方在根据某种轮询策略选择一个具体位置进行服务调用。

威尼斯人棋牌 3

    • 服务注册:在服务治理框架中, 通常都会构建一个注册中心, 每个服务单元向注册 中心登记自己提供的服务, 将主机与端口号、 版本号、 通信协议等一些附加信息告 知注册中心, 注册中心按服务名分类组织服务清单。 比如, 我们有两个提供服务A 的进程分别运行于 192.168.0.100:8000和192.168.0.101:8000位置上, 另外还有三个 提供服务B的进程分别运行千192.168.0.100:9000 、 192.168.0.101:9000、 192.168.0.102:9000位置上。 当这些进程均启动, 并向注册中心注册自己的服务之后, 注册中心就会维护类似下面的一个服务清单。 另外, 服务注册中心还需要以心跳的方式去监测清单中的服务是否可用, 若不可用 需要从服务清单中剔除, 达到排除故障服务的效果。

Netflix Eureka

  Spring Cloud Eureka,使用Netflix Eureka来实现服务注册与发现,它既包含了服务端组件,也包含了客户端组件。

   服务名                                                              位置 

Eureka服务端

  Eureka服务端,我们也称为服务注册中心,他同其他服务注册中心一样,支持高可用配置。它依托于强一致性提供良好的服务实例可用性,可以应对多种不同的故障场景。

  如果Eureka以集群方式部署,当集群中有分片出现故障时,那么Eureka就转入自我保护模式。它允许在分片故障期间继续提供服务的发现和注册,当故障分片恢复运行时,集群中的其他分片会把它们的状态再次同步回来。

   服务A                                 192.168.0.100:8000、192.168.0.101:8000

Eureka客户端

  Eureka客户端,主要处理服务的注册与发现。客户端服务通过注解和参数配置的方式,嵌入在客户端应用程序的代码中,在应用程序运行时,Eureka客户端向注册中心注册自身提供的服务并周期性地发送心跳来更新它的服务租约。同时,他也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期性地刷新服务状态。

   服务B                         192.168.0.100:9000、192.168.0.101:9000、192.168.0.102:9000

服务端与客户端的关系

威尼斯人棋牌 4

 

搭建服务注册中心

        1.创建Spring Boot工程,命名为eureka-server,并在pom中加入必要依赖,如下图:

<parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>1.5.4.RELEASE</version>
     <relativePath/> <!-- lookup parent from repository -->
</parent>

<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

<dependencyManagement>
     <dependencies>
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-dependencies</artifactId>
             <version>Camden.SR7</version>
             <type>pom</type>
             <scope>import</scope>
         </dependency>
     </dependencies>
</dependencyManagement>

     2.通过@EnableEurekaServer注解启动一个服务注册中心提供给其他应用进行对话。在Spring boot应用中添加这个注解就能开启此功能。

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
    
    
     public static void main(String[] args) {
        
         new SpringApplicationBuilder(EurekaServerApplication.class).web(true).run(args);
     }
}

在默认情况下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为,只需在application.properties中增加如下配置:

spring.application.name=eureka-server
server.port=1111
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

  • spring.application.name是服务名称,会在服务注册中心中看到这个属性的值,也是服务间调用时使用的名字。
  • server.port是该服务启动时所使用的端口号。
  • eureka.instance.hostname这是自定义参数。
  • eureka.client.register-with-eureka因为该应用为注册中心,所以设置为false,代表不向服务注册中心注册自己。
  • eureka.client.fetch-registry因为服务注册中心的职责就是维护服务服务实例,它并不需要去检索服务,所以设置为false。

完成上面的配置,在浏览器中输入http:localhost:1111/,如图:

威尼斯人棋牌 5

此时的Instances currently registered with Eureka栏是空的,因为还没有服务注册到注册中心。

    • 服务发现:由于在服务治理框架下运作, 服务间的调用不再通过指定具体的实例地 址来实现, 而是通过向服务名发起请求调用实现。 所以, 服务调用方在调用服务提 供方接口的时候, 并不知道具体的服务实例位置。 因此, 调用方需要向服务注册中 心咨询服务, 并获取所有服务的实例清单, 以实现对具体服务实例的访问。 比如, 现有服务C希望调用服务A, 服务C就需要向注册中心发起咨询服务请求, 服务注 册中心就会将服务A的位置清单返回给服务C, 如按上例服务A的情况,C便获得 了服务A的两个可用位置 192.168.0.100:8000和192.168.0.101:8000。 当服务C要发起调用的时候, 便从该清单中以某种轮询策略取出一 个位置来进行服 务调用, 这就是后续我们将会介绍的客户端负载均衡。 这里我们只是列举了一种简 单的服务治理逻辑, 以方便理解服务治理框架的基本运行思路。 实际的框架为了性 能等因素, 不会采用每次都向服务注册中心获取服务的方式, 并且不同的应用场景 在缓存和服务剔除等机制上也会有一些不同的实现策略。

注册服务提供者(Eureka客户端)

    我们可以直接使用上一章创建的Spring Boot应用加入到Eureka的服务治理体系中。

    1.修改pom.xml,增加spring cloud eureka模块的依赖。如下:

<dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

<dependencyManagement>
         <dependencies>
             <dependency>
                 <groupId>org.springframework.cloud</groupId>
                 <artifactId>spring-cloud-dependencies</artifactId>
                 <version>Camden.SR7</version>
                 <type>pom</type>
                 <scope>import</scope>
             </dependency>
         </dependencies>
</dependencyManagement>

    2.修改HelloController类 在日志中打印服务的相关内容:

@RestController
public class HelloController{
    
     private final Logger logger = Logger.getLogger(getClass());
     @Autowired
     private DiscoveryClient client;
    
     @RequestMapping(value="/hello",method = RequestMethod.GET)
     public String index() {
         ServiceInstance instance = client.getLocalServiceInstance();
         logger.info("/hello , host:" instance.getHost() ", service_id:" instance.getServiceId());
         return "hello world";
     }
}

    3.在主类中添加@EnableDiscoveryClient注解,激活Eureka中的DiscoveryClient实现(自动化配置,创建DiscoveryClient接口针对Eureka客户端的EurekaDiscoveryClient实例)

@EnableDiscoveryClient
@SpringBootApplication

@ComponentScan("com.microservice.web")//引号中填写Controller所在包名
public class SpringbootApplication {

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

    4.修改application.properties文件:

spring.application.name=hello-service
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

  • eureka.client.serviceUrl.defaultZone属性指定服务注册中心的地址。

    5.分别启动服务注册中心和hello-service服务。结果如下图:

威尼斯人棋牌 6

通过访问localhost:8080/hello,直接向该服务发起请求,在控制台可以看到如下图所示:

威尼斯人棋牌 7

这些输出的内容就是我们在controller中注入的DiscoveryClient接口对象,从服务注册中心获取的服务相关信息。

   Spring Cloud Eureka, 使用Netflix Eureka来实现服务注册与发现, 它既包含了服务端组件,也包含了客户端组件,并且服务端与客户端均采用Java编写,所以Eureka主要适用 于通过Java实现的分布式系统,或是与NM兼容语言构建的系统。但是, 由于Eureka服 务端的服务治理机制提供了完备的RESTfulAPL所以它也支持将非Java语言构建的微服 务应用纳入Eureka的服务治理体系中来。只是在使用其他语言平台的时候,需要自己来实 现Eureka的客户端程序。不过庆幸的是,在目前几个较为流行的开发平台上,都已经有了 一些针对Eureka 注册中心的客户端实现框架, 比如.NET平台的 Steeltoe、 Node.js 的 eureka-js-client等。

    Eureka服务端,我们也称为服务注册中心。 它同其他服务注册中心一样,支持高可用 配置。它依托于强一致性提供良好的服务实例可用性,可以应对多种不同的故障场景。 如 果Eureka以集群模式部署,当集群中有分片出现故障时,那么Eureka就转入自我保护模 式。它允许在分片故障期间继续提供服务的发现和注册,当故障分片恢复运行时, 集群中 的其他分片会把它们的状态再次同步回来。以在AWS 上的实践为例, Netflix推荐每个可 用的区域运行一个Eureka服务端,通过它来形成集群。不同可用区域的服务注册中心通过 异步模式互相复制各自的状态,这意味着在任意给定的时间点每个实例关于所有服务的状 态是有细微差别的。

    Eureka客户端,主要处理服务的注册与发现。客户端服务通过注解和参数配置的方式, 嵌入在客户端应用程序的代码中,在应用程序运行时,Eureka客户端向注册中心注册自身 提供的服务并周期性地发送心跳来更新它的服务租约。同时,它也能从服务端查询当前注 册的服务信息并把它们缓存到本地并周期性地刷新服务状态。

    下面我们来构建一些简单示例,学习如何使用Eureka构建注册中心以及进行注册与发 现服务。

搭建服务注册中心

    首先,创建一个基础的Spring Boot工程,命名为eureka-server, 并在pom.xml 中引入必要的依赖内容, 代码如下:

<parent>        
    <groupId>org.springframework.boot</groupId>        
    <artifactId>spring-boot-starter-parent</artifactId>        
    <version>1.5.10.RELEASE</version>        
    <relativePath/> <!-- lookup parent from repository -->    
</parent>
 <dependency>          
     <groupId>org.springframework.cloud</groupId>           
     <artifactId>spring-cloud-starter-eureka-server</artifactId>           
     <version>1.4.4.RELEASE</version>        
 </dependency>
 <dependencyManagement>    
     <dependencies>            
         <dependency>                
             <groupId>org.springframework.cloud</groupId>                
             <artifactId>spring-cloud-dependencies</artifactId>                
             <version>Brixton.SR7</version>                
             <type>pom</type>                
             <scope>import</scope>            
         </dependency>        
     </dependencies>    
 </dependencyManagement>

 

通过@EnableEurekaServer 注解启动一个服务注册中心提供给其他应用进行对话。 这一步非常简单, 只需在一个普通的 Spring Boot 应用中添加这个注解就能开启此功能, 比 如下面的例子:

威尼斯人棋牌 8

    在默认设置下, 该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们 需要禁用它的客户端注册行为, 只需在 application.properties 中增加如下配置:

威尼斯人棋牌 9

本文由威尼斯人棋牌发布于计算机教程,转载请注明出处:基于Spring Cloud的微服务构建学习-3 服务治理:S