这个礼拜六和礼拜天在学习SpringCloud实现微服务的一个demo,下面是我摘抄的一些介绍:
Eureka:
Eureka是Spring Cloud Netflix微服务套件中的一部分,可以与Springboot构建的微服务很容易的整合起来。
Eureka包含了服务器端和客户端组件。服务器端,也被称作是服务注册中心,用于提供服务的注册与发现。Eureka支持高可用的配置,当集群中有分片出现故障时,Eureka就会转入自动保护模式,它允许分片故障期间继续提供服务的发现和注册,当故障分片恢复正常时,集群中其他分片会把他们的状态再次同步回来。
客户端组件包含服务消费者与服务生产者。在应用程序运行时,Eureka客户端向注册中心注册自身提供的服务并周期性的发送心跳来更新它的服务租约。同时也可以从服务端查询当前注册的服务信息并把他们缓存到本地并周期性的刷新服务状态。
Hystrix:
在一个分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,这个就是Hystrix需要做的事情。Hystrix提供了熔断、隔离、Fallback、cache、监控等功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。
feign:
Feign是一个声明式的Web服务客户端,使用Feign可使得Web服务客户端的写入更加方便。
它具有可插拔注释支持,包括Feign注解和JAX-RS注解、Feign还支持可插拔编码器和解码器、Spring Cloud增加了对Spring MVC注释的支持,并HttpMessageConverters在Spring Web中使用了默认使用的相同方式。Spring Cloud集成了Ribbon和Eureka,在使用Feign时提供负载平衡的http客户端。
废话不多说直接上图片,代码:
一 、首先我们需要搭建一个SpringCloudEurekaServer作为SpringCloud微服务提供注册
我们先搭建一个Maven父工程项目,步骤省略。
父工程的pom文件的结构为
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> </parent> <dependencies> <!-- Spring Boot web依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
然后在下面创建Module即我们的SpringCloudEurekaServer
子工程SpringCloudEurekaServer的pom文件的结构为
<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>Edgware.RELEASE</spring-cloud.version> </properties> <dependencies> <!--eureka server --> <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>${spring-cloud.version}</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>
SpringCloudEurekaServer其中properties文件的配置为
#端口号 server.port=8090 # eureka.instance.hostname=localhost spring.application.name=eureka-server ##不注册自己 eureka.client.register-with-eureka=false ##false来表明自己是一个eureka server eureka.client.fetch-registry=false eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
SpringCloudEurekaServer的Application启动文件为
@EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
运行后的截图效果访问你设置的端口,其中相关参数的意义可以自己去查询。
上面的步骤就是建立了一个Eureka的服务,下面创建以个服务提供方。
新创建一个module,我叫做SpringCloudProvide:
其中pom文件需要添加依赖如下
<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-services.version>1.5.0.RELEASE</spring-cloud-services.version> <spring-cloud.version>Edgware.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Edgware.SR3</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-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
其中properties文件的配置如下
server.port=8091 #表示是否将自己注册在EurekaServer上,默认为true。由于当前应用就是EurekaServer,所以置为false eureka.client.register-with-eureka=true #表示表示是否从EurekaServer获取注册信息,默认为true。单节点不需要同步其他的EurekaServer节点的数据 eureka.client.fetch-registry=false #设置Eureka的地址 eureka.client.service-url.defaultZone=http://localhost:8090/eureka/ spring.application.name=provide-demo-1
主Application需要添加的注解如下:
@SpringBootApplication @EnableEurekaClient public class MircProvideApplication { public static void main(String[] args) { SpringApplication.run(MircProvideApplication.class, args); } }
启动后可以看到访问原来的EurekaServer中以及注册了相关的服务
。
接下来我们来创建SpringCloudComsume,服务消费方。
服务的消费方的pom依赖文件和上面的提供方一直,需要多添加Hystrix的依赖
<dependency> <groupId>org.springframework.cloud</groupId> <!--注意此处的依赖是SpringBoot2.0以后专用的,如果您使用的SpringBoot版本低于2.0请使用spring-cloud-starter-feign--> <artifactId>spring-cloud-starter-feign</artifactId> </dependency>
启动Application类需添加注解如下:
@SpringBootApplication @EnableEurekaClient @EnableFeignClients @EnableCircuitBreaker public class FeignHystrixApplication { public static void main(String[] args) { SpringApplication.run(FeignHystrixApplication.class, args); } }
最后实现了feign+hystrix 负载均衡,断熔访问服务。
最后这张图我用断点让它不能返回,后hystrix超时后会调用预先的方法返回响应的信息。
具体的代码我不在复制了,需要可以访问我的github:git@github.com:hm1365166/SpringCloudLearnDemo.git