天天看点

SpringCloud-Eureka单机

简介

Spring Cloud Eureka是SpringCloud Netflix项目下的服务治理模块,它包含Server和Client两部分。而SpringCloud Netflix项目是Spring Cloud的子项目之一,它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),网关(Zuul),负载均衡(Ribbon)等。

Eureka服务端

eureka服务端也成为“注册中心”,用于提供服务的注册和发现,支持高可用配置。

Eureka客户端

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

简单来说,客户端通过注册中心,获取服务端服务的地址信息,再根据地址进行服务调用,而注册中心来维护各服务的状态,比如发送心跳验证健康状态,判断是否在线,同时记录其服务地址,以供查询。

实践

创建Eureka服务端

1、新建一个SpringBoot项目,pom配置文件如下:

<dependencies>
	<!-- web -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	
	<!-- EurekaServer 2.x-->
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
	</dependency>
	
	<!-- EurekaServer 1.x-->
	<!--
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
	</dependency> 
	 -->

	<!-- test -->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>
           

2、配置yml文件

# 端口号
server:
  port: 8001

spring:
  application:
    name: eurekaServer
    
#IP地址
eureka:
  instance:
  # 实例的主机名
    hostname: 127.0.0.1
  client: 
    #表示不向注册中心注册自己。由于该应用为注册中心,所以设置为false。
    register-with-eureka: false
    #表示不去检索其他服务。由于注册中心的职责是维护服务实例,它并不需要检索服务,所以设置为false
    fetch-registry: false
    serviceUrl:
      #指定服务注册中心地址 这里直接指向了本服务
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
           

3、项目启动类添加注解

@EnableEurekaServer	//启动服务中心默认配置
@SpringBootApplication
public class SpringBootEurekaServerApplication {

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

}
           

启动服务端项目,打开浏览器访问:http://127.0.0.1:8001出现以下界面表示访问成功

SpringCloud-Eureka单机
由于还没有服务注册上去,所以列表为空 No instances available,接下来创建Eureka的服务端

创建Eureka客户端

1、新建一个SpringBoot项目,引入pom依赖

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

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>
           

2、在启动类添加注解。

@EnableDiscoveryClient
@SpringBootApplication
public class SpringBootEurekaClientApplication {

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

}
           
注意:这里也可使用@EnableEurekaClient注解,但一般不这么用,直接使用@EnableDiscoveryClient实现自动发现。因为

SpringCloud

本身支持

Eureka

Consul

zookeeper

等实现注册中心功能,若写死了某个注册中心的相关注解,之后替换时,还需要修改注解类。

3、配置yml文件

spring:
  application:
    name: eurekaclient
    
#端口号
server:
  port: 8002
  
eureka:
  client:
    serviceUrl:
      #注册中心地址
      defaultZone: http://127.0.0.1:8001/eureka
  instance:
    #启用ip配置,这样在注册中心列表看见的就是IP+端口号
    prefer-ip-address: true
    #实例名称
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
           

4、编写一个接口

@RestController
public class test {

	@GetMapping("/")
	public String index() {
		return "spring-cloud-eureka-client";
	}
}
           

启动客户端项目,刷新服务端页面。

SpringCloud-Eureka单机
可以看到客户端注册成功

Eureka注册中心访问认证

默认情况下,访问注册中心页面是匿名访问的,不需要一些认证。在生产中,为了安全性,可加入身份认证功能。

1、服务端加入POM依赖。

<!-- 认证依赖 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>
           

2、在服务端启动类中添加以下代码,(代码来自官网)

/**
     * 忽略此路径下的CSRF令牌
     * @author WYIRAN
     */
	@EnableWebSecurity
	class WebSecurityConfig extends WebSecurityConfigurerAdapter {

	    @Override
	    protected void configure(HttpSecurity http) throws Exception {
	        http.csrf().ignoringAntMatchers("/eureka/**");
	        super.configure(http);
	    }
	}
           

3、修改yml文件配置:加入用户名和密码,并在注册中心地址中加入用户名和密码

# 端口号
server:
  port: 8001

spring:
  application:
    name: eurekaServer
  security:
    user:
      # 用户名
      name: wyiran
      # 密码
      password: 123456
#IP地址
eureka:
  instance:
  # 实例的主机名
    hostname: 127.0.0.1
  client: 
    # 表示不向注册中心注册自己。由于该应用为注册中心,所以设置为false。
    register-with-eureka: false
    # 表示不去检索其他服务。由于注册中心的职责是维护服务实例,它并不需要检索服务,所以设置为false
    fetch-registry: false
    serviceUrl:
      # 指定服务注册中心地址 这里直接指向了本服务
      defaultZone: http://wyiran:[email protected]${eureka.instance.hostname}:${server.port}/eureka/
           

最后一步,在客户端配置文件中的注册中心地址里加入用户名和密码。如下:

defaultZone: http://wyiran:[email protected]:8001/eureka/
           

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1rjE0vOq-1576116244387)(C:\Users\WangYR\AppData\Roaming\Typora\typora-user-images\image-20191212095158001.png)]

注意点:

1、当用户名和密码为空或不设置的情况下,用户名默认为user,密码随机,在项目启动时会打印在控制台。例:Using generated security password: 1a821db8-6047-48af-b86e-053a77e72d4f

2、用户名不能大写,否则在客户端启动时会报错。具体什么原因我也不清楚,哈哈哈。

3、客户端只需要在注册中心地址加入用户名和密码,不需要导入依赖,也不需要在启动类加入额外代码。

接着启动项目,访问 http://localhost8001 可以看到现在需要账号密码才可以进入注册中心UI界面。

SpringCloud-Eureka单机

登陆后查看UI界面发现已经注册成功了。

SpringCloud-Eureka单机

Eureka自我保护机制

以上截图红色字体报错:EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.是由于Eureka自我保护机制造成的。

Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果服务刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等。

我们在单机测试的时候很容易满足心跳失败比例在 15 分钟之内低于 85%,这个时候就会触发 Eureka 的保护机制,一旦开启了保护机制,则服务注册中心维护的服务实例就不是那么准确了,此时我们可以使用

eureka.server.enable-self-preservation=false

来关闭保护机制,这样可以确保注册中心中不可用的实例被及时的剔除(不推荐)。

想详细了解Eureka的自我保护机制可以看看这边文章→SpringCloud自我保护机制

总结

本章主要讲了SpringCloud的Eureka的基本使用方法和一些概念,代码比较简单,主要就是理解Eureka的服务端和客户端的相关概念。文章均为学习记录,若有不对的地方欢迎指出,谢谢。

继续阅读