zoukankan      html  css  js  c++  java
  • spring Cloud-NETFLIX-Eureka(服务注册)

    1.创建服务注册中心(Spring Cloud Netflix的Eureka)

    创建maven主工程

    然后创建两个model 

    一个作为服务注册中心,即Eureka Server

    另外一个作为Eureka Client。

    Eureka Server的创建

     启动服务注册中心

    为eureka增加密码

     第一步,为Eureka服务端(eureka-server)添加安全认证依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    第二步,增加application.yml配置文件:

    ###服务端口号
    server:
      port: 8100
    
    ###服务名称
    spring:
      application:
        name: app-eureka-center
      security:
        basic:
          enable: true #开启基于HTTP basic的认证 高版本的spring cloud不用这个配置
        user: #配置用户的账号信息
          name: zpc
          password: 123456
    
    eureka:
      instance:
        #注册中心地址
        hostname: 127.0.0.1
    
    ###客户端调用地址
      client:
        serviceUrl:
          defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${eureka.instance.hostname}:8100/eureka/
    ###是否将自己注册到Eureka服务中,因为该应用本身就是注册中心,不需要再注册自己(集群的时候为true)
        register-with-eureka: false
    ###是否从Eureka中获取注册信息,因为自己为注册中心,不会在该应用中的检索服务信息
        fetch-registry: true

    第三步,在eurka服务端添加一个安全认证类:

    package com.zpc.springcloud.eureka;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.config.http.SessionCreationPolicy;
    
    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
        /**
         * 高版本springcloud的丢弃了配置:
         *
         * security:
         *   basic:
         *    enabled: true
         *
         * 所以应该使用以下方式开启
         *
         * @param http
         * @throws Exception
         */
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            // Configure HttpSecurity as needed (e.g. enable http basic).
            http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER);
            http.csrf().disable();
            //注意:为了可以使用 http://${user}:${password}@${host}:${port}/eureka/ 这种方式登录,所以必须是httpBasic,
            // 如果是form方式,不能使用url格式登录
            http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
        }
    }

    第四步,重新启动Eureka服务进行测试:

    Eureka Client的创建

    1.创建过程:无

    如果eureka是带有密码的。客户端的url需要修改一下

    http://用户名:密码@IP:端口/eureka

    例子:http://zpc:123456@127.0.0.1:8100/eureka

     如果要注册多eureka集群中,需要配置多个defaultZone

    e.g:     defaultZone: http://zpc:123456@127.0.0.1:8100/eureka/,http://zpc:123456@127.0.0.1:9100/eureka/

    Eureka的自我保护模式

     

     如图,当前Eureka进入了自我保护模式。(先开启Eureka server端和client端,然后再断开client端,此时刷新Eureka界面,就会看到红色字样)

    在短时间内丢失了服务实例的心跳,不会剔除该服务,这是eurekaserver的自我保护机制的宗旨。主要是为了防止由于短暂的网络故障误删除可用的服务。

    所以,一般进入自我保护模式,无需处理。如果,需要禁用自我保护模式,只需要在配置文件中添加配置即可:
    (测试环境、开发环境可以关闭自我保护机制,保证服务不可用时及时剔除)
    配置方式:在server端 配置文件中添加server: 配置

    eureka:
      instance:
        #注册中心地址
        hostname: 127.0.0.1
    
    ###客户端调用地址
      client:
        serviceUrl:
          defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${eureka.instance.hostname}:8100/eureka/
        register-with-eureka: false
        fetch-registry: true
    
      server:
          enable-self-preservation: false #禁用自我保护模式
          evictionIntervalTimerInMs: 15000  #驱逐下线的服务,默认是60,此配置建议只试用开发和测试环境
          responseCacheUpdateIntervalMs: 2000  #服务可用列表缓存刷新时间,毫秒

    下图代表关闭了保护模式

    提示,如果禁用自我保护模式,在网络通信故障下可能会出现问题,因为服务可能只是短暂的不可用。
    上述界面出现后,断开client端,此时刷新Eureka界面,就会看到红色字样,同时会把服务实例从注册中心剔除:No instances available

    Eureka的高可用(Eureka集群)

    搭建Eureka集群非常简单,只要启动多个Eureka Server服务并且让这些Server端之间彼此进行注册即可实现。

    第一步,修改eureka server端的application.yml文件:

    • 端口为8100的机器注册到端口为9100的注册中心
    ###服务端口号
    server:
      port: 8100
    
    ###服务名称
    spring:
      application:
        name: app-eureka-center
      security:
        basic:
          enable: true #开启基于HTTP basic的认证
        user: #配置用户的账号信息
          name: zpc
          password: 123456
    
    eureka:
      instance:
        #注册中心地址
        hostname: 127.0.0.1
    
    ###客户端调用地址
      client:
        serviceUrl:
          defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${eureka.instance.hostname}:9100/eureka/
       ###是否将自己注册到Eureka服务中,为true的时候可以在ek界面看到。为false看不到
        register-with-eureka: true
        fetch-registry: true
    
      server:
          enable-self-preservation: false

    第二步,修改配置文件,再建一个Eureka server工程,启动两个工程(两个工程的name属性一样)测试:

    • 端口为9100的机器注册到端口为8100的注册中心
    ###服务端口号
    server:
     port: 9100
    
    ###服务名称
    spring:
     application:
       name: app-eureka-center
     security:
       basic:
         enable: true #开启基于HTTP basic的认证
       user: #配置用户的账号信息
         name: zpc
         password: 123456
    
    eureka:
     instance:
       #注册中心地址
       hostname: 127.0.0.1
    ###客户端调用地址
     client:
       serviceUrl:
         defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@${eureka.instance.hostname}:8100/eureka/
    ###是否将自己注册到Eureka服务中,为true的时候可以在ek界面看到。为false看不到
    register
    -with-eureka: true fetch-registry: true ###测试环境、开发环境可以关闭自我保护机制,保证服务不可用时及时剔除 server: enable-self-preservation: false eviction-interval-timer-in-ms: 2000 #清理间隔

    指定ek上注册的服务的IP地址

    在服务的提供者配置文件中可以指定ip地址,如下:

    ###服务注册到eureka注册中心的地址
    eureka:
      client:
        service-url:
               defaultZone: http://zpc:123456@127.0.0.1:8100/eureka/,http://zpc:123456@127.0.0.1:9100/eureka/
    ###因为该应用为服务提供者,是eureka的一个客户端,需要注册到注册中心
        register-with-eureka: true
    ###是否需要从eureka上检索服务
        fetch-registry: true
      instance:
          prefer-ip-address: true #将自己的ip地址注册到Eureka服务中
          ip-address: 127.0.0.1

    指定实例id

     通过instance-id 参数指定服务注册到Eureka中的服务实例id:

    eureka:
      client:
        service-url:
               defaultZone: http://zpc:123456@127.0.0.1:8100/eureka/,http://zpc:123456@127.0.0.1:9100/eureka/
    ###因为该应用为服务提供者,是eureka的一个客户端,需要注册到注册中心
        register-with-eureka: true
    ###是否需要从eureka上检索服务
        fetch-registry: true
      instance:
          prefer-ip-address: true #将自己的ip地址注册到Eureka服务中
          ip-address: 127.0.0.1
          instance-id: ${spring.application.name}###${server.port} #指定应用名+端口
        ###或者用下面这个
        instanceId: ${spring.cloud.client.ip-address}:${server.port}#指定IP+端口


     

    踢出eureka上错误的服务

    日常开发中,可能出现开发人员不小心把本地的服务注册到测试环境的EK的情况。要怎么解决呢?

    1.开发人员关闭本地服务,EK服务端配置保护模式,将不可用的服务自动剔除

    2.主动触发下线

    使用postman

    请求格式为: /eureka/apps/{application.name}/  

    ip端口为EK访问地址的IP、端口

    EK服务生命周期监控

    EurekaInstanceCanceledEvent 服务下线事件
    EurekaInstanceRegisteredEvent 服务注册事件
    EurekaInstanceRenewedEvent 服务续约事件
    EurekaRegistryAvailableEvent Eureka注册中心启动事件
    EurekaServerStartedEvent Eureka Server启动事件

    服务端:

    配置

    server:
      port: 8081
    eureka:
      instance:
        hostname: localhost
      client:
        registerWithEureka: false
        fetchRegistry: false
        serviceUrl:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      server:
          #关闭自我保护
          enable-self-preservation: false
          #清理间隔
          eviction-interval-timer-in-ms: 5000

    进行监听时服务配置这里的 关闭自我保护和清理间隔一定要打开

    服务监听类

    package com.lhw.event;
     
    import com.netflix.appinfo.InstanceInfo;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.cloud.netflix.eureka.server.event.*;
    import org.springframework.context.event.EventListener;
    import org.springframework.stereotype.Component;
     
     
    @Component
    public class EurekaStateListener {
     
        private final static Logger logger = LoggerFactory.getLogger(EurekaStateListener.class);
     
        @EventListener
        public void listen(EurekaInstanceCanceledEvent  event) {
            logger.info("服务{}已下线", event.getAppName());
            logger.info("server地址信息{}", event.getServerId());
        }
     
        @EventListener
        public void listen(EurekaInstanceRegisteredEvent event) {
            InstanceInfo instanceInfo = event.getInstanceInfo();
            logger.info("服务{}进行注册", instanceInfo.getAppName()+ instanceInfo.getHostName() +"  "+ instanceInfo.getIPAddr() +"  "+ instanceInfo.getPort());
        }
     
        @EventListener
        public void listen(EurekaInstanceRenewedEvent event) {
            logger.info("服务{}进行续约", event.getServerId() +"  "+ event.getAppName());
        }
     
        @EventListener
        public void listen(EurekaRegistryAvailableEvent event) {
            logger.info("注册中心启动,{}", System.currentTimeMillis());
        }
     
        @EventListener
        public void listen(EurekaServerStartedEvent event) {
            logger.info("注册中心服务端启动,{}", System.currentTimeMillis());
        }
    }

    客户端:

    客户端配置

    spring:
      application:
        name: lhwTest
    eureka:
      instance:
        # 每间隔1s,向服务端发送一次心跳,证明自己依然”存活“
        lease-renewal-interval-in-seconds: 1
        # 告诉服务端,如果我2s之内没有给你发心跳,就代表我“死”了,将我踢出掉。
        lease-expiration-duration-in-seconds: 2
      client:
        serviceUrl:
          defaultZone: http://localhost:8081/eureka/
    server:
      port: 8082

    客户端启动文件

    package com.lhw.clientTest;
     
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    @SpringBootApplication
    @EnableEurekaClient
    public class MemberApp {
     
        public static void main(String[] args){
            SpringApplication.run(MemberApp.class, args);
        }
    }

    测试:

    服务端日志:

    客户端日志

    关闭客户端 服务端控制台打印如下信息

    转载自:http://www.cnblogs.com/chry/p/7248947.html

  • 相关阅读:
    【转载】Linux系统,设置Oracle开机启动,待整理
    【linux命令】grep
    Oracle 遇到的错误及处理整理
    【转载,整理】开启归档模式,归档日志已满处理
    【转载】【Oracle 11gR2】db_install.rsp详解
    CSS3属性选择器总结
    nginx负载均衡参数说明
    Nginx限制某个IP访问
    权限系统设计
    http-关于application/x-www-form-urlencoded等字符编码的解释说明
  • 原文地址:https://www.cnblogs.com/linhongwenBlog/p/8697259.html
Copyright © 2011-2022 走看看