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

posted @ 2018-04-02 20:45  林被熊烟岛  阅读(264)  评论(0编辑  收藏  举报