zoukankan      html  css  js  c++  java
  • springcloud(三)-Eureka

    Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是springcloud体系中最重要最核心的组件之一。

     服务发现简介

    服务中心又称注册中心,管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,比如dubbo admin后台的各种功能。

    有了服务中心调用关系会有什么变化?

    上一节我们见识了springcloud最简单的微服务调用。类似于

    项目A调用项目B

    正常调用项目A请求项目B

    有了服务发现Eureka机制,任何一个服务都不能直接去掉用,都需要通过服务中心来调用


    如果是项目A调用项目B,项目B在调用项目C

    这时候调用的步骤就会为两步:第一步,项目A首先从服务中心请求项目B服务器,然后项目B在从服务中心请求项目C服务。

    这样做有什么好处呢?如果只有这样一两个服务,而且访问量不大的情况下,这样做确实有点画蛇添足的感觉。但是,如果像这样的服务由二三十个,上百个呢?画一张图来描述几十个项目之间的相互调用关系全是线条,任何其中的一个项目改动,就会牵连好几个项目跟着重启,巨麻烦而且容易出错。通过服务中心来获取服务你不需要关注你调用的项目IP地址,由几台服务器组成,每次直接去服务中心获取可以使用的服务去调用既可。

    由于各种服务都注册到了服务中心,就有了去做很多高级功能条件。比如几台服务提供相同服务来做均衡负载;监控服务器调用成功率来做熔断,移除服务列表中的故障点;监控服务调用时间来对不同的服务器设置不同的权重等等。

    Eureka 简介

    Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。

    用一张图来认识以下:

    上图简要描述了Eureka的基本架构,由3个角色组成:

    1、Eureka Server

    • 提供服务注册和发现

    2、Service Provider

    • 服务提供方
    • 将自身服务注册到Eureka,从而使服务消费方能够找到

    3、Service Consumer

    • 服务消费方
    • 从Eureka获取注册服务列表,从而能够消费服务

    编写Eureka Server

    spring cloud已经帮我实现了服务注册中心,我们只需要很简单的几个步骤就可以完成。

    1.创建一个maven工程,pom.xml文件添加依赖

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

     1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     2   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     3   <modelVersion>4.0.0</modelVersion>
     4 
     5   <groupId>com.itmuch.cloud</groupId>
     6   <artifactId>microservice-discovery-eureka</artifactId>
     7   <version>0.0.1-SNAPSHOT</version>
     8   <packaging>jar</packaging>
     9 
    10   <name>microservice-discovery-eureka</name>
    11   <url>http://maven.apache.org</url>
    12 
    13   <parent>
    14         <groupId>org.springframework.boot</groupId>
    15         <artifactId>spring-boot-starter-parent</artifactId>
    16         <version>1.5.9.RELEASE</version>
    17     </parent>
    18 
    19   <properties>
    20     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    21     <java.version>1.8</java.version>
    22   </properties>
    23 
    24   <dependencies>
    25            <dependency>
    26             <groupId>org.springframework.boot</groupId>
    27             <artifactId>spring-boot-starter-web</artifactId>
    28         </dependency>
    29         <!--         用于监控spring boot 端点 -->
    30         <dependency>
    31             <groupId>org.springframework.boot</groupId>
    32             <artifactId>spring-boot-starter-actuator</artifactId>
    33         </dependency>
    34         <dependency>
    35             <groupId>org.springframework.boot</groupId>
    36             <artifactId>spring-boot-starter-tomcat</artifactId>
    37         </dependency>
    38         <dependency>
    39             <groupId>org.springframework.boot</groupId>
    40             <artifactId>spring-boot-devtools</artifactId>
    41             <optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
    42         </dependency>
    43         <dependency>
    44             <groupId>org.springframework.cloud</groupId>
    45             <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    46         </dependency>
    47   </dependencies>
    48   
    49 <!--   引入spring cloud 的依赖 -->
    50     <dependencyManagement>
    51         <dependencies>
    52             <dependency>
    53                 <groupId>org.springframework.cloud</groupId>
    54                 <artifactId>spring-cloud-dependencies</artifactId>
    55                 <version>Edgware.RELEASE</version>
    56                 <type>pom</type>
    57                 <scope>import</scope>
    58             </dependency>
    59         </dependencies>
    60     </dependencyManagement>
    61   
    62 <!--   添加spring-boot 的maven插件 -->
    63     <build>
    64         <plugins>
    65             <plugin>
    66                 <groupId>org.springframework.boot</groupId>
    67                 <artifactId>spring-boot-maven-plugin</artifactId>
    68             </plugin>
    69         </plugins>
    70     </build>
    71 </project>
    点击展开

    2.编写启动类,添加@EnableEurekaServer注解,声明这是一个Eureka Server

    package com.itmuch.cloud;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaApplication.class, args);
        }
    }

    3.配置文件application.yml

    server:
      port: 8083
    eureka:
      client:
        registerWithEureka: false
        fetchRegistry: false
        serviceUrl:
          defaultZone: http://localhost:8083/eureka

    简单介绍一下:

    • eureka.client.registerWithEureka:表示是否将自己注册到Eureka Server,默认为true。由于当前应用就是Eureka Server,故而这里设为false。
    • eureka.client.fetchRegistry:表示是否从Eureka Server获取注册信息。默认为true。因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,所以设为false 
    • eureka.client.serviceUrl.defaultZone:设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8083/eureka;多个地址间可使用“,”分隔。

    这样一个Eureka Server就编写完了。

    测试

    启动Eureka Server 启动类。访问 http://localhost:8083/,可以打开界面

    目前没有任务服务注册到上面。

    将微服务注册到Eureka Server上

    改写上一节的microservice-simple-provider-user

    1.pom.xml文件添加依赖

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

    2.配置application.yml

    server:
      port: 8084
    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:8083/eureka/
      instance:
        prefer-ip-address: true
    spring:
      application:
        name: microservice-provider-user
      jpa:
        generate-ddl: false
        show-sql: true
        database-platform: org.hibernate.dialect.MySQL5Dialect
        hibernate:
          ddl-auto: none
      datasource:
        url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=UTF-8
        username: root
        password: 1234
        driver-class-name: com.mysql.jdbc.Driver
      http:
        multipart:
          maxFileSize: 100Mb
          maxRequestSize: 100Mb
    logging:
      level:
        root: INFO
        org.hibernate: INFO
        org.hibernate.type.descriptor.sql.BasicBinder: TRACE
        org.hibernate.type.descriptor.sql.BasicExtractor: TRACE

    其中,spring.application.name用于指定注册到Eureka Server上的应用名称;eureka.instance.prefer-ip-address = true 表示将自己的IP注册到Eureka Server。若不配置该属性或将其设置为false,则表示注册微服务所在操作系统的hostname到Eureka Server 。

    另外,同样的操作,给microservice-consumer-movie也来一遍。

    测试

    启动 microservice-discovery-eureka

    启动 microservice-provider-user

    启动 microservice-consumer-movie

    注:因为每一个服务在启动的时候都会注册到服务发现上面去,如果eureka没开的话,服务在启动的时候会报找不到服务发现的错误,所以一般都是先开eureka。但是就算你后启动eureka,每一个服务客户端都会在eureka启动之后,再连到上面去,不会影响使用。

    访问http://localhost:8083/,可看到页面

    由此图可知,我们的两个微服务客户端已经被注册到Eureka Server 上了。

    我们访问http://localhost:8082/user/1,得到结果

    {"id":1,"username":"account1","name":"张三","age":20,"balance":98.23}

    由此可知,movie服务通过Eureka Server 找到 user 服务,访问获得了结果。

    OK!完美!

    这一节没多少新代码,该有的都再上面贴出来了。源码就不放了。

  • 相关阅读:
    2.12 使用@DataProvider
    2.11 webdriver中使用 FileUtils ()
    Xcode8 添加PCH文件
    The app icon set "AppIcon" has an unassigned child告警
    Launch Image
    iOS App图标和启动画面尺寸
    iPhone屏幕尺寸、分辨率及适配
    Xcode下载失败 使用已购项目页面再试一次
    could not find developer disk image
    NSDate与 NSString 、long long类型的相互转化
  • 原文地址:https://www.cnblogs.com/fengyuduke/p/10593791.html
Copyright © 2011-2022 走看看