- 浏览: 194084 次
- 性别:
- 来自: 南京
文章分类
最新评论
一、简介
在微服务架构中服务发现是一个非常核心的功能。在spring cloud中可以很方便集成Netflix Service Discovery组件eureka。Eureka包含server和client,其中server端能够以群集的形式提供,各个sever又可以通过同步其他server中注册的service状态来实现高可用性。
当一个Eureka client向server注册时,会提供自身的元数据信息,包括host、port、health check URI等信息,Eureka server通过侦听同一个service的不同实例的心跳信息来确定当前实例是否正常,如果心跳信息失败,就会自动将该实例移除。
调用注册到Eureka中的服务,可以不直接采用EurekaClient,利用声明式的rest client :feign,或者Spring RestTemplate可以更加方便的调用注册在Eureka总的服务。
二、例子1. Eureka server
核心是在正常的Spring boot程序中加入spring-cloud-starter-eureka-server依赖,在启动类中加入@EnableEurekaServer 注解
代码结构:
启动类
pom文件
应用配置信息
2.Eureka client(即user server端)
核心是在正常的Spring boot程序中加入spring-cloud-starter-eureka依赖,在启动类中加入@EnableDiscoveryClient注解
代码结构:
启动类
pom文件
应用配置信息
3.User client(调用注册到Eureka server中的Eureka client)
核心是在正常的Spring boot程序中加入spring-cloud-starter-eureka、spring-cloud-starter-feign依赖,在启动类中加入@EnableFeignClients注解
代码结构:
启动类
FeignClient中的service id要和User server配置信息中的spring.application.name的值保持一致
pom文件
应用配置信息
三、启动
按下面的顺序启动
Eureka server ->user server -> user client
等所有应用都启动后通过界面访问http://localhost:7211/greeting,可以正常访问user-server中的方法返回值,整个流程是 界面访问 user client 工程中的hello方法,user client通过@FeignClient中指定的service id从Eureka server中获取到注册的 HelloServer instance,即 user server,然后调用user server中的hello方法,返回调用结果给 user client,最终返回界面
四、Eureka 集群
1.修改Eureka-server对应的配置文件
2.修改user-server对应的配置文件
注意:application.name 修改过,feignclient对应的serviceid也需要修改
3.修改user-client对应的配置文件
3.如果在同一台机器上,修改hosts
依次启动 Eureka-server user-server user-client,其中启动Eureka-server时用
启动三次,此时Eureka-server以集群形式提供服务,可以关闭任意一个或两个来测试Eureka的高可用性primary
secondary
tertiary
在微服务架构中服务发现是一个非常核心的功能。在spring cloud中可以很方便集成Netflix Service Discovery组件eureka。Eureka包含server和client,其中server端能够以群集的形式提供,各个sever又可以通过同步其他server中注册的service状态来实现高可用性。
当一个Eureka client向server注册时,会提供自身的元数据信息,包括host、port、health check URI等信息,Eureka server通过侦听同一个service的不同实例的心跳信息来确定当前实例是否正常,如果心跳信息失败,就会自动将该实例移除。
调用注册到Eureka中的服务,可以不直接采用EurekaClient,利用声明式的rest client :feign,或者Spring RestTemplate可以更加方便的调用注册在Eureka总的服务。
二、例子
package hello; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer @SpringBootApplication public class EurekaServiceApplication { public static void main(String[] args) { SpringApplication.run(EurekaServiceApplication.class, args); } }
<?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.example</groupId> <artifactId>eureka-service</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/libs-snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </project>
server.port=8761 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false logging.level.com.netflix.eureka=OFF logging.level.com.netflix.discovery=OFF
package demo; import java.util.Arrays; import java.util.List; import java.util.Random; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author Spencer Gibb */ @SpringBootApplication @EnableDiscoveryClient @RestController public class HelloServerApplication { @RequestMapping("/greeting") public String hello() { List<String> greeting = Arrays.asList("Hi there","Greetings","Salutations"); Random rand = new Random(); int randomNum = rand.nextInt(greeting.size()); return greeting.get(randomNum); } public static void main(String[] args) { SpringApplication.run(HelloServerApplication.class, args); } }
<?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>org.test</groupId> <artifactId>feign-eureka-hello-server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>feign-eureka-hello-server</name> <description>Demo project for Spring Cloud</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
spring: application: name: HelloServer server: port: 7111 eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ instance: leaseRenewalIntervalInSeconds: 10 metadataMap: instanceId: ${vcap.application.instance_id:${spring.application.name}:${spring.application.instance_id:${server.port}}}
package demo; import static org.springframework.web.bind.annotation.RequestMethod.GET; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author Spencer Gibb */ @SpringBootApplication @RestController @EnableFeignClients public class HelloClientApplication { @Autowired HelloClient client; @RequestMapping("/greeting") public String hello() { return client.hello(); } public static void main(String[] args) { SpringApplication.run(HelloClientApplication.class, args); } @FeignClient("HelloServer") interface HelloClient { @RequestMapping(value = "/greeting", method = GET) String hello(); } }
FeignClient中的service id要和User server配置信息中的spring.application.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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.test</groupId> <artifactId>feign-eureka-hello-client</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>feign-eureka-hello-client</name> <description>Demo project for Spring Cloud</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
spring: application: name: HelloClient server: port: 7211 eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ instance: leaseRenewalIntervalInSeconds: 10 metadataMap: instanceId: ${vcap.application.instance_id:${spring.application.name}:${spring.application.instance_id:${server.port}}} endpoints: restart: enabled: true shutdown: enabled: true health: sensitive: false
三、启动
按下面的顺序启动
Eureka server ->user server -> user client
等所有应用都启动后通过界面访问http://localhost:7211/greeting,可以正常访问user-server中的方法返回值,整个流程是 界面访问 user client 工程中的hello方法,user client通过@FeignClient中指定的service id从Eureka server中获取到注册的 HelloServer instance,即 user server,然后调用user server中的hello方法,返回调用结果给 user client,最终返回界面
四、Eureka 集群
1.修改Eureka-server对应的配置文件
spring: application: name: eureka-server-clustered profiles: primary server: port: 8011 eureka: instance: hostname: eureka-primary client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://eureka-secondary:8012/eureka/,http://eureka-tertiary:8013/eureka/ --- spring: application: name: eureka-server-clustered profiles: secondary server: port: 8012 eureka: instance: hostname: eureka-secondary client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://eureka-tertiary:8013/eureka/,http://eureka-primary:8011/eureka/ --- spring: application: name: eureka-server-clustered profiles: tertiary server: port: 8013 eureka: instance: hostname: eureka-tertiary client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://eureka-primary:8011/eureka/,http://eureka-secondary:8012/eureka/
2.修改user-server对应的配置文件
spring: application: name: UserServer server: port: 7111 eureka: client: serviceUrl: defaultZone: http://eureka-secondary:8012/eureka/ instance: leaseRenewalIntervalInSeconds: 10 metadataMap: instanceId: ${vcap.application.instance_id:${spring.application.name}:${spring.application.instance_id:${server.port}}}
注意:application.name 修改过,feignclient对应的serviceid也需要修改
3.修改user-client对应的配置文件
spring: application: name: UserClient server: port: 7211 eureka: client: serviceUrl: defaultZone: http://eureka-primary:8011/eureka/,http://eureka-secondary:8012/eureka/,http://eureka-tertiary:8013/eureka/ instance: leaseRenewalIntervalInSeconds: 10 metadataMap: instanceId: ${vcap.application.instance_id:${spring.application.name}:${spring.application.instance_id:${server.port}}} endpoints: restart: enabled: true shutdown: enabled: true health: sensitive: false
3.如果在同一台机器上,修改hosts
# 127.0.0.1 localhost # ::1 localhost 127.0.0.1 localhost 127.0.0.1 eureka-primary 127.0.0.1 eureka-secondary 127.0.0.1 eureka-tertiary
依次启动 Eureka-server user-server user-client,其中启动Eureka-server时用
java -jar eureka-server-clustered-0.0.1-SNAPSHOT.jar --spring.profiles.active=primary java -jar eureka-server-clustered-0.0.1-SNAPSHOT.jar --spring.profiles.active=secondary java -jar eureka-server-clustered-0.0.1-SNAPSHOT.jar --spring.profiles.active=tertiary
启动三次,此时Eureka-server以集群形式提供服务,可以关闭任意一个或两个来测试Eureka的高可用性
发表评论
-
spring cloud eureka
2017-04-04 14:16 4368参照Spring Cloud Netflix Eureka - ... -
spring cloud config
2017-04-03 09:58 885一、什么是spring cloud config 1.Sp ... -
Spring cloud zuul
2017-10-18 11:04 1309什么是zuul 在微服务架构中,如何把拆分好的大量微服务服务 ... -
Spring cloud eureka feign ribbon
2017-02-12 21:18 2824Ribbon提供一种客户端的负载均衡技术,实现和集群中的服务通 ...
相关推荐
使用spring cloud中的eureka/feign/maven 构建实战例子,注意是采用maven,UserApiWeb(消费者)去调用UserApiImpl(提供者),UserApiEureka(注册中心),UserApi(api接口),消费者和提供者都是依赖接口来开发的。...
在这个学习资料中,你将能够掌握如何在Java环境中搭建Spring Cloud微服务架构,包括如何配置Eureka服务注册与发现,使用Feign进行服务间的通信,以及如何利用Spring Cloud Gateway作为统一的入口来处理各种请求。...
在给定的标题和描述中,我们看到了几个关键组件:Eureka、Zuul、Ribbon、Hystrix 和 Feign,这些都是Spring Cloud生态中的重要组成部分。下面将详细阐述这些组件及其在实际应用中的作用。 1. **Eureka**:它是...
在这个项目中,我们关注的是SpringCloud Eureka、Zuul、Feign以及它们在负载均衡中的应用。 1. **SpringCloud Eureka**: Eureka是SpringCloud的一个核心组件,它作为服务注册与发现的工具。每个微服务启动时,...
RS注解,SpringCloud又为Feign增加了对SpringMVC注解的支持,同时为了能够使用和Spring Web中默认使用的相同的httpMessageConverter,SpringCloud集成了Ribbon和Eureka,用来在使用Feign时能够为其提供一个负载均衡...
本项目以"分布式集群springBoot+springCloud+Eureka+Feign.zip"为主题,旨在创建一个基于Spring Boot、Spring Cloud、Eureka和Feign的基础框架。下面将详细介绍这些技术以及如何将它们整合到一起。 首先,Spring ...
《SpringCloud Eureka Feign MyBatis Seata整合实践》 在微服务架构中,分布式事务处理是一项重要的挑战。Seata(前身是Fate)作为阿里巴巴开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务...
SpringCloud Eureka是微服务架构中的关键组件,它作为一个服务注册与发现的工具,使得服务之间的调用变得简单。在最新版本2.x.x中,Eureka提供了更稳定、高效的特性来支持大规模分布式系统的构建。 首先,让我们...
Spring Cloud提供了Ribbon和Feign这两个客户端负载均衡器,它们与Eureka结合使用,可以自动选择服务实例进行请求。Ribbon是低级库,适用于自定义客户端,而Feign是基于Ribbon的声明式HTTP客户端,使得服务调用更加...
Eureka、Feign是Spring Cloud生态中的两个重要组件,它们共同解决了服务发现和服务调用的问题,尤其是配合实现负载均衡的功能。现在我们来深入探讨一下这两个组件以及它们如何协同工作。 **1. Spring Cloud Eureka*...
本项目是一个SpringCloud Eureka集群的示例,旨在帮助开发者了解如何设置和运行一个包含双节点的Eureka集群,以实现高可用的服务注册中心。 首先,我们来理解Eureka的基本工作原理。Eureka服务器作为服务注册中心,...
在本教程中,我们将深入探讨如何在Spring Cloud框架下实现Eureka集群,并整合Zuul和Feign。首先,我们要理解这些组件的核心功能。 **Eureka**是Spring Cloud中的服务发现组件,它允许微服务之间互相发现并进行通信...
总结一下,本文主要介绍了SpringCloud中如何利用Feign进行服务间的声明式调用,并结合Eureka实现服务发现,同时借助Hystrix实现断路器功能,保证系统的健壮性。通过实际项目TDCloud的实践,可以加深对这些概念和技术...
【SpringCloud之Feign】是Spring Cloud生态体系中一个重要的组件,主要用于服务间的调用,实现了声明式的服务调用,极大地简化了微服务之间的通信。Feign基于Netflix Hystrix进行了整合,支持服务熔断,提高了系统的...
Spring Cloud Eureka是Netflix开发的服务发现组件,它在微服务架构中扮演着核心角色,用于管理服务实例的注册与发现。Eureka客户端是Eureka生态系统的一部分,它允许微服务应用注册到Eureka服务器并获取其他服务的...
本教程将详细介绍如何整合SpringCloud与Eureka,创建一个基本的服务发现示例。 首先,我们需要理解Eureka的工作原理。Eureka是一个基于REST的服务,它作为服务注册中心,使得各个微服务能够相互发现。每个微服务在...
Spring Cloud将Feign与Eureka结合,使服务发现更加便捷,从而简化了微服务架构中的服务间通信。 首先,我们来理解一下创建Eureka服务器的过程。Eureka是Netflix提供的一种服务注册与发现的组件,它允许微服务应用将...
在Spring Cloud项目中,pom.xml会包含Spring Cloud的父POM,以及Eureka Server、服务提供者和服务消费者所需的依赖,如`spring-cloud-starter-netflix-eureka-client`、`spring-cloud-starter-netflix-eureka-server...
- **Eureka 整合**:结合 Spring Cloud Eureka,Feign 可以从服务注册中心发现并调用服务,实现微服务间的无感知通信。 2. **Feign 的工作原理** - **接口定义**:在 Spring Cloud Feign 中,你需要创建一个接口...