赞
踩
Eureka是Netflix开源的一款提供服务注册和发现的产品,是Spring Cloud中最核心的组件之一。
如果没有注册中心(即服务中心),多个项目之间的调用就会出现混乱。
- <?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>
- <groupId>com.example</groupId>
- <artifactId>eureka</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <name>eureka</name>
- <description>Demo project for Spring Boot</description>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.1.4.RELEASE</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
-
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <java.version>1.8</java.version>
- </properties>
- <dependencies>
- <!-- 引入的Eureka-server -->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
- <version>2.0.1.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-autoconfigure</artifactId>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
这里注意Spring Boot版本,如果2.4.1可能会报错找不到某些类,降低版本即可。
添加@EnableEurekaServer注解
- @SpringBootApplication
- @EnableEurekaServer
- public class EurekaApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(EurekaApplication.class, args);
- }
-
- }
- spring:
- application:
- name: spring-cloud-eureka
-
- server:
- port: 8888
- eureka:
- client:
- register-with-eureka: false
- fetch-registry: false
-
- serviceUrl:
- defaultZone: http://localhost:${server.port}/eureka/
eureka.client.register-with-eureka
:表示是否将自己注册到Eureka Server,默认为true。eureka.client.fetch-registry
:表示是否从Eureka Server获取注册信息,默认为true。eureka.client.serviceUrl.defaultZone
:设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。
这时只需每个eureka的
serviceUrl.defaultZone指向其它的eureka节点地址即可。比如
defaultZone: http://test1:8888/eureka/,http://test2:8888/eureka/
- <?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>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.1.4.RELEASE</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <groupId>com.example</groupId>
- <artifactId>provider</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <name>provider</name>
- <description>Demo project for Spring Boot</description>
-
-
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <java.version>1.8</java.version>
- </properties>
- <dependencies>
- <!-- 引入的Eureka-server -->
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
- <version>2.0.1.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-autoconfigure</artifactId>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
-
- </project>
- eureka:
- client:
- serviceUrl: #注册中心的注册地址
- defaultZone: http://localhost:8888/eureka/
- server:
- port: 8082 #服务端口号
- spring:
- application:
- name: service-provider #服务名称--调用的时候根据名称来调用该服务的方法
加上注解@EnableEurekaClient
(@EnableDiscoveryClient和@EnableEurekaClient共同点就是:都是能够让注册中心能够发现,扫描到该服务。不同点:
@
EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient
可以是其他注册中心。)
- @SpringBootApplication
- @EnableEurekaClient
- public class ProviderApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(ProviderApplication.class, args);
- }
-
-
- }
- /**
- * 功能说明
- *
- * @author winrh
- * @version 1.0.0
- * @date 2021/1/12
- */
- @RestController
- public class MyController {
- /**
- * 假如这个客户端要提供一个hello的方法
- * @return
- */
- @GetMapping(value = "/hello")
- @ResponseBody
- public String hello(@RequestParam String name){
- return "Hello, " + name;
- }
- }
自测一下没问题:
- <?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>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.1.4.RELEASE</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <groupId>com.example</groupId>
- <artifactId>consumer</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <name>consumer</name>
- <description>Demo project for Spring Boot</description>
-
- <properties>
- <java.version>1.8</java.version>
- </properties>
-
- <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-server</artifactId>
- <version>2.0.1.RELEASE</version>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-feign</artifactId>
- <version>1.4.6.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-openfeign-core</artifactId>
- <version>2.2.5.RELEASE</version>
- </dependency>
-
- <dependency>
- <groupId>io.github.openfeign</groupId>
- <artifactId>feign-jackson</artifactId>
- <version>10.9</version>
- </dependency>
- </dependencies>
-
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
-
- </project>
- eureka:
- client:
- serviceUrl: #注册中心的注册地址
- defaultZone: http://localhost:8888/eureka/
- server:
- port: 8083 #服务端口号
- spring:
- application:
- name: service-consumer #服务名称--调用的时候根据名称来调用该服务的方法
入口类加注解@EnableDiscoveryClient、@EnableFeignClients(Feign实际可以用dubbo取代,这里练一练)
- @SpringBootApplication
- @EnableDiscoveryClient
- @EnableFeignClients
- public class ConsumerApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(ConsumerApplication.class, args);
- }
-
- }
用FeignClient调用,需要定义接口。其中,service-provider对应的是注册中心中的服务名,也就是服务提供者全局配置文件写的Spring.application.name。
- /**
- * feign接口
- * example-provider为远程服务名
- *
- * @author winrh
- * @version 1.0.0
- * @date 2021/1/12
- */
-
- @FeignClient(name = "service-provider")
- public interface MyFeign {
- @GetMapping("/hello")
- String hello(@RequestParam(value = "name") String name);
-
- }
- /**
- * 功能说明
- *
- * @author winrh
- * @version 1.0.0
- * @date 2021/1/12
- */
- @RestController
- public class MyController {
- @Autowired
- private MyFeign myFeign;
-
- @GetMapping("/hello")
- public String hello(String name) {
- return myFeign.hello(name);
- }
- }
看看效果:
表格来源:https://www.jianshu.com/p/afd7776a64c6
对比项目\注册中心 | Spring Cloud Nacos | Spring Cloud Eureka |
---|---|---|
客户端更新服务信息 | 使用注册+DNS-f+健康检查模式。 DNS-F客户端使用监听模式push/pull拉取更新信息 | 客户端定时轮询服务端获取其他服务ip信息并对比,相比之下服务端压力较大、延迟较大 |
伸缩性 | 使用Raft选举算法性能、可用性、容错性均比较好,新加入节点无需与所有节点互相广播同步信息 | 由于使用广播同步信息,集群超过1000台机器后对eureka集群压力很大 |
健康检查模式/方式 | 支持服务端/客户端/关闭检查模式,检查方式有tcp、http、sql。支持自己构建健康检查器 | 客户端向服务端发送http心跳 |
负载均衡 | 支持 | 支持 |
手动上下线服务方式 | 通过控制台页面和API | 通过调用API |
跨中心同步 | 支持 | 不支持 |
k8s集成 | 支持 | 不支持 |
分组 | Nacos可用根据业务和环境进行分组管理 | 不支持 |
权重 | Nacos默认提供权重设置功能,调整承载流量压力 | 不支持 |
厂商 | 阿里巴巴 | Netflix |
Eureka开源工作已停止,后续不再有更新和维护,而Nacos在以后的版本会支持Spring Cloud+K8s的组合。并且Nacos也是配置中心,这简化了部署维护。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。