第一篇:注册中心Eureka
什么是注册中心?
注册中心管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,有了注册中心之后,任何一个服务都不在是直连的,都需要通过注册中心去调用。
由于各种服务都注册到了服务中心,就有了去做很多高级功能条件。比如几台服务提供相同服务来做均衡负载;监控服务器调用成功率来做熔断,移除服务列表中的故障点;监控服务调用时间来对不同的服务器设置不同的权重等等。
什么是Eureka,有什么用?
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry
和Service Discovery
实现。也是springcloud体系中最重要最核心的组件之一。
Eureka 是一个基于 REST
的服务,主要在 AWS 云中使用, 定位服务来进行中间层服务器的负载均衡和故障转移。
Eureka 采用了 C-S
的设计架构。Eureka Server
作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka
的客户端连接到 Eureka Server
,并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server
来监控系统中各个微服务是否正常运行。
如何创建服务注册中心
首先创建一个空的Maven项目,做为父工程,一直下一步下一步至完成,如下图
创建好后删除src文件,因为是用它来做父工程
修改pom.xml文件,加载依赖
<?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.niuben</groupId> <artifactId>spring-cloud</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <!--父依赖--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <relativePath/> </parent> <!--属性定义--> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.RELEASE</spring-cloud.version> </properties> <!--spring-boot test依赖--> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <!--版本管理--> <dependencyManagement> <dependencies> <!--spring-cloud依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!--Maven打包插件--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
parent: 父级依赖项目,这里能看到依赖的父级的springboot的版本
properties: 当前配置文件一些配置,可以看到Java的版本是1.8,springcloud的版本是Finchley.RELEASE
dependencies: 当前项目依赖的组件
dependencyManagement: 这里是声明依赖,并不实现引入,如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本
build: 在build中声明了当前使用的插件,spring-boot-maven-plugin,主要功能:能够将Spring Boot应用打包为可执行的jar或war文件
然后在创建2个model,eureka-server和service-client,创建过程同创建父工程
eureka-server项目
创建完eureka-server后,引入父工程pom文件,同时引入spring-cloud-starter-netflix-eureka-server
依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
编写配置文件application.yml
server:
port: 8761
spring:
application:
name: eurka-server
eureka:
server:
enable-self-preservation: false
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
enable-self-preservation: 防止由于Eureka的机制导致Client被错误显示在线,仅在开发环境使用,生产环境需缓存此信息,防止因网络波动导致服务频繁上下线
register-with-eureka: 不想注册中心注册自己
然后在启动类上开启eureka注解@EnableEurekaServer,表明是一个EurekaServer
@SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
此时打开浏览器,输入http://localhost:8761,界面如下
因为没有注册服务所以不可能有服务被发现
service-client项目
创建完eureka-client后,引入父工程pom文件,同时引入spring-cloud-starter-netflix-eureka-client依赖
<!--Eureka 客户端依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--Web依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
编写配置文件application.yml
server: port: 8762 spring: application: name: eureka-client eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/
配置文件中的spring.application.name很重要,这在以后的服务与服务之间相互调用一般都是根据这个name
然后在启动类上开启@EnableEurekaClient注解,表明自己是一个eureka client
@SpringBootApplication @EnableEurekaClient public class EurekaClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class, args); } }
编写一个controller层,创建TestEurekaClient类
@RestController public class TestEurekaClient { @Value("${server.port}") String port; @RequestMapping("/test") public String home(@RequestParam(value = "name", defaultValue = "niuben") String name) { return "hi " + name + " ,现在的端口是:" + port; } }
依次启动eureka server,eureka-client
打开http://localhost:8761,会发现已经发现服务了
这时打开 http://localhost:8762/test?name=haha ,你会在浏览器上看到
hi haha ,现在的端口是:8762
小知识
@EnableDiscoveryClient和@EnableEurekaClient
共同点:都是能够让注册中心能够发现,扫描到改服务
不同点:@
EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient
可以是其他注册中心