zoukankan      html  css  js  c++  java
  • SpringCloud初体验:一、Eureka 服务的注册与发现

    Eureka :云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。

    Eureka 可以大致理解为 房产中介 和 房东 的关系,房东想让租客租房子,首先要把房子登记在房产中介,当租客需要租房子的时候,中介就把租客带到房东的房子里。

    Eureka 分为 服务端(EurekaServer) 和 客户端(EurekaClient),在 SpringCloud 的世界里,只要想提供服务使用的应用都可以是客户端,然后在客户端启用的时候注册到服务端

    Eureka 服务端 配置:

    Eureka  服务端推荐做成一个独立的服务。

    最简单的四个操作步骤:

    1、初始化一个 SpringBoot 应用

    2、引入 pom.xml 中 maven 依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.zjj7</groupId>
        <artifactId>eureka_server</artifactId>
        <version>1.0.0</version>
        <packaging>jar</packaging>
    
        <name>eureka_server</name>
        <description>Demo project for Spring Boot</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.4.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <!--配置仓库-->
        <repositories>
            <repository>
                <id>aliRepository</id>
                <name>aliRepository</name>
                <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
    
        <!-- 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>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    
    </project>
    View Code

     

    3、配置 application.yml 中相关配置

    # 服务应用名称
    spring:
      application:
        name: eureka-server
    
    #服务注册中心端口号
    server:
      port: 6110
    
    
    #服务注册中心实例的主机名
    #是否向服务注册中心注册自己
    #是否检索服务
    #服务注册中心的配置内容,指定服务注册中心的位置
    eureka:
      instance:
        hostname: localhost
      client:
        register-with-eureka: false
        fetch-registry: false
        serviceUrl:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    View Code

    4、给启动类添加 @EnableEurekaServer 注释

     

    好了,这样就可以启动 EurekaServer 这个应用了,可以在浏览器中打开应用的 http://ip:port 即可看见可视化界面

     Eureka 客户端 配置:

    1、引入 pom.xml 中 maven 依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.zjj7</groupId>
        <artifactId>publish</artifactId>
        <version>1.0.0</version>
        <packaging>jar</packaging>
    
        <name>publish</name>
        <description>Demo project for Spring Boot</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.4.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <!--配置仓库-->
        <repositories>
            <repository>
                <id>aliRepository</id>
                <name>aliRepository</name>
                <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
    
        <!-- 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>
    
        <dependencies>
            <!--<dependency>-->
                <!--<groupId>org.springframework.boot</groupId>-->
                <!--<artifactId>spring-boot-starter-data-jpa</artifactId>-->
            <!--</dependency>-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
    
            <!--lombok依赖-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.16.10</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    
    </project>
    View Code

    2、配置 application.yml 中相关配置

    spring:
      application:
        name: publish
    
    #feign 配置
    feign:
      hystrix:
        enabled: true
      client:
        config:
          default:
            connectTimeout: 5000
            readTimeout: 5000
            loggerLevel: full
    
    #hystrix 熔断机制
    hystrix:
      shareSecurityContext: true
      command:
        default:
          circuitBreaker:
            # 熔断后的重试时间窗口,且在该时间窗口内只允许一次重试。即在熔断开关打开后,在该时间窗口允许有一次重试,如果重试成功,则将重置Health采样统计并闭合熔断开关实现快速恢复,否则熔断开关还是打开状态,执行快速失败, 默认为为5s。
            sleepWindowInMilliseconds: 10000
            # 如果在一个采样时间窗口内,失败率超过该配置,则自动打开熔断开关实现降级处理,即快速失败。默认配置下采样周期为10s,失败率为50%。
            errorThresholdPercentage: 50
            # 在熔断开关闭合情况下,在进行失败率判断之前,一个采样周期内必须进行至少N个请求才能进行采样统计,目的是有足够的采样使得失败率计算正确,默认为20。
            requestVolumeThreshold: 20
            # 是否强制关闭熔断开关,如果强制关闭了熔断开关,则请求不会被降级,一些特殊场景可以动态配置该开关,默认为false。
            forceClosed: false
            # 是否强制打开熔断开关,如果强制打开可熔断开关,则请求强制降级调用getFallback处理,可以通过动态配置来打开该开关实现一些特殊需求,默认为false。
            forceOpen: false
          execution:
            isolation:
              thread:
                # 是否启用执行超时机制,默认为true
                timeoutEnabled: true
                # 执行超时时间,默认为1000毫秒,如果命令是线程隔离,且配置了executionIsolationThreadInterruptOnTimeout=true,则执行线程将执行中断处理。如果命令是信号量隔离,则进行终止操作,因为信号量隔离与主线程是在一个线程中执行,其不会中断线程处理,所以要根据实际情况来决定是否采用信号量隔离,尤其涉及网络访问的情况。
                timeoutInMilliseconds: 1000
                # 当隔离策略为THREAD时,当执行线程执行超时时,是否进行中断处理,即Future#cancel(true)处理,默认为false。
                interruptOnFutureCancel: true
                # 当隔离策略为THREAD时,当执行线程执行超时时,是否进行中断处理,默认为true。
                interruptOnTimeout: true
    
    #服务注册中心端口号
    server:
      port: 6121
    
    #服务注册中心实例的主机名、端口
    #是否向服务注册中心注册自己
    #是否检索服务
    #服务注册中心的配置内容,指定服务注册中心的位置
    eureka:
      port:
        6110
      instance:
        hostname: localhost
      client:
        register-with-eureka: true
        fetch-registry: true
        serviceUrl:
          defaultZone: http://${eureka.instance.hostname}:${eureka.port}/eureka/
    
    logging:
      level:
        com.zjj7.publish.feignClien: DEBUG
    View Code

    3、给启动类添加 @EnableEurekaClient 注释

     好了,这样就可以启动 EurekaClient 这个应用了

    在 Eureka 服务端中 可视化界面就能看见 注册 上去的服务信息了

    小结: Eureka 最基本的操作已经完成了,还有些高级特性待后续扩展,如何做到 Eureka 服务端的高可用,多启用几个 Eureka 服务,既是服务端又是客户端,注册到各个服务节点上去

  • 相关阅读:
    Python pip – error: invalid command ‘bdist_wheel’
    css实现文字两端对齐(兼容所有浏览器)
    webpack中的require.context
    node 的path模块中 path.resolve()和path.join()的区别
    react-native项目中遇到的问题
    react-native针对android改变状态栏样式
    createBottomTabNavigator: 怎么在切换tab的时候让页面重新渲染
    当vue页面异步加载的数据想在页面上渲染怎么办
    git分布式版本控制系统
    $router和$route的区别,路由跳转方式name 、 path 和传参方式params 、query的区别
  • 原文地址:https://www.cnblogs.com/liugx/p/9420710.html
Copyright © 2011-2022 走看看