目录
前言
随着应用系统业务复杂度和用户量的提升,应用逐渐从单机模式演变成集群模式,接着进行业务上的拆分,形成各个业务的微服务系统。那么,微服务之间如何保证相互的安全可靠并且灵活通信就成了亟需关注的问题。Eureka、Zookeeper等注册中心提供的服务注册发现功能由此诞生。
Eureka简介
为什么需要Eureka
在没有注册中心前,服务与服务之间的通信,一般采用的方式是,在应用中配置好要访问的应用的域名或者IP、访问路径等,无论是硬编码还是配置编码,这样当域名或者IP对应的provider应用集群发生变化时,需要手动进行修改consumer应用集群的配置,才能正常访问provider服务;另外,provider应用集群中有台实例机器出现宕机,但是由于consumer应用集群不知道,导致一部分请求到provider集群的宕机实例中,出现请求失败的情况。
Eureka这时候站出来,牛逼轰轰的说:上面的问题都不是问题,我一出手就知道有没有。
什么是Eureka
我们先来围观下Eureka到底扮演什么角色
Eureka-server:Eureka服务集群,角色我们这里定义为“中介”;
provider-server:提供业务接口服务集群,角色定义为“卖家”;
consumer-server:调用provider接口的服务集群,角色定义为“买家”;
eureka这个“中介”负责提供服务注册、服务发现的功能:
1、服务注册:provider-server一个“卖家A”实例服务后,主动向eureka“中介”注册应用名称、IP地址等信息;consumerer-server的“买家B”也一样,启动后主动注册自己的服务信息;
2、服务发现:consumer集群根据provider的应用名称拉取注册列表,通过负载均衡方式请求服务。
Eureka代码例子
创建Eureka服务
基于springboot进行开发:
1、pom文件引入Eureka-server包
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.eureka</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、配置application.properties
# 端口号
server.port=8761
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.default-zone=http://${eureka.instance.hostname}:${server.port}/eureka/
eureka.server.wait-time-in-ms-when-sync-empty=0
eureka.server.enable-self-preservation=false
# 针对client下线没有通知server的问题,调整EvictionTask的调度频率,从默认的60秒调整为5秒
eureka.server.eviction-interval-timer-in-ms=5000
# 针对缓存问题,可以关闭readOnlyCacheMap或调整readWriteCacheMap时间
eureka.server.use-read-only-response-cache=false
3、启动类EurekaServerApplication:添加注解@EnableEurekaServer
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
4、运行服务,访问 http://IP:8761/ 进入Eureka-server的控制台
创建provider服务
1、pom文件引入eureka-client的包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
2、配置application.properties
# Provider端口号
server.port=8081
# 应用名称
spring.application.name=provider-client
# 注册地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
3、启动类ProviderClientApplication:添加注解@EnableDiscoveryClient
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderClientApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderClientApplication.class, args);
}
}
4、运行服务后,可以从eureka的控制台中看到:
创建consumer服务
1、pom文件引入eureka-client的包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
2、配置application.properties
# Provider端口号
server.port=8082
# 应用名称
spring.application.name=consumer-client
# 注册地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
3、启动类ProviderClientApplication:添加注解@EnableDiscoveryClient
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerClientApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerClientApplication.class, args);
}
}
4、运行服务后,可以从eureka的控制台中看到:
5、获取provider的注册列表
@Resource
LoadBalancerClient loadBalancerClient;
public String getProvider(String providerName) {
// 根据负载均衡获取一个provider服务实例
ServiceInstance serviceInstance = loadBalancerClient.choose(providerName);
return serviceInstance.getHost() + ":" + serviceInstance.getPort();
}