本案例将打架一个微服务框架,参考来源官方参考文档
微服务:是什么?网上有一堆资料。不做叙述。
标题提到的框架是spring-cloud-netflix相关开源框架。
demo源码github
摘自官方说明:
Spring Cloud Netflix provides Netflix OSS integrations for Spring Boot apps through autoconfiguration and binding to the Spring Environment and other Spring programming model idioms. With a few simple annotations you can quickly enable and configure the common patterns inside your application and build large distributed systems with battle-tested Netflix components. The patterns provided include Service Discovery (Eureka), Circuit Breaker (Hystrix), Intelligent Routing (Zuul) and Client Side Load Balancing (Ribbon)..
通过上述可以了解到:
Eureka:服务发现
Hystrix:断路器
Zuul:智能路由
Ribbon:客户端负载均衡
先图话后
Eureka:实际上在整个过程中维护者每个服务的生命周期。每一个服务都要被注册到Eureka服务器上,这里被注册到Eureka的服务又称为Client。Eureka通过心跳来确定服务是否正常。Eureka只做请求转发。同时Eureka是支持集群的呦!!!
Zuul:类似于网关,反向代理。为外部请求提供统一入口。
Ribbon/Feign:可以理解为调用服务的客户端。
Hystrix:断路器,服务调用通常是深层的,一个底层服务通常为多个上层服务提供服务,那么如果底层服务失败则会造成大面积失败,Hystrix就是就调用失败后触发定义好的处理方法,从而更友好的解决出错。也是微服务的容错机制。
多说不如看代码
下面我们将搭建一个单Eureka服务器的案例,我们将会注册两个微服务,并配置Zuul。
目标:
1.模拟外部请求,访问暴漏端口(Eureka监听端口)访问其中一个内部服务。
2.演示服务间如何通过Feign进行调用。
综述:
我们要写的包括:
一个Eureka服务器
两个微服务
抽取出公共的POM部分,让我们专注重点
<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.xbz.eureka.demo</groupId> <artifactId>demo-eureka-server</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <java.version>1.7</java.version> <file.encoding>UTF-8</file.encoding> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix</artifactId> <version>1.2.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> </dependencies><build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>${file.encoding}</encoding> </configuration> </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>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
Eureka单例服务器(即不将自身作为一个Client) 我们只需要三个步骤就可以启动服务器 1.POM引入<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId></dependency>
2.搞个Main启动类
@EnableEurekaServer
@EnableZuulProxy
package com.xbz.eureka.demo.serverimport org.springframework.boot.autoconfigure.SpringBootApplicationimport org.springframework.boot.builder.SpringApplicationBuilderimport org.springframework.cloud.netflix.eureka.server.EnableEurekaServerimport org.springframework.cloud.netflix.zuul.EnableZuulProxy@SpringBootApplication@EnableEurekaServer@EnableZuulProxypublic class EnurekaServer { public static void main(String[] args) { new SpringApplicationBuilder(EnurekaServer.class).web(true).run(args) }}
3.重点:application.yml
server: port: 8761 eureka: client: registerWithEureka: false fetchRegistry: false zuul: prefix: /techouse routes: cloud-client: path: /usersystem/** serviceId: cloud-client ribbon: eureka: enabled: false cloud-client: ribbon: listOfServers: 127.0.0.1:8800
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
两个微服务 服务cluod-client 客户端pom<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId></dependency>
这个服务我们在上面的application.yml中配置了,等下我们就可以用Eureka服务器地址访问此服务。
该服务包含一个HellController,和ServerApplication(启动类)
HelloController.java
package com.xbz.eureka.demo.client.controllerimport org.springframework.web.bind.annotation.PathVariableimport org.springframework.web.bind.annotation.RequestMappingimport org.springframework.web.bind.annotation.RestControllerimport com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand@RestControllerpublic class HelloController { @RequestMapping("/hello/{fallback}") @HystrixCommand(fallbackMethod="helloFallbackMethod") public String hello(@PathVariable("fallback") String fallback){ if("1".equals(fallback)){ throw new RuntimeException("...") } return "hello" } public String helloFallbackMethod(String fallback){ return "fallback 参数值为:"+fallback }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
ServerApplication.java
@EnableEurekaClient,确保该应用注册到Eureka服务器
@EnableHystrix 断路器生效
package com.xbz.eureka.demo.clientimport org.springframework.boot.SpringApplicationimport org.springframework.boot.autoconfigure.SpringBootApplicationimport org.springframework.cloud.netflix.eureka.EnableEurekaClientimport org.springframework.cloud.netflix.hystrix.EnableHystrix@SpringBootApplication@EnableEurekaClient@EnableHystrixpublic class ServiceApplication { public static void main(String[] args) { SpringApplication.run(ServiceApplication.class, args) }}
重要的application.xml
server: port: 8800spring: application: name: cloud-client #为你的应用起个名字,该名字将注册到eureka注册中心eureka: instance: statusPageUrlPath: ${management.context-path}/info healthCheckUrlPath: ${management.context-path}/health client: serviceUrl: defaultZone: http://localhost:8761/eureka/ #去哪里注册,eureka服务地址
服务cluod-client-consumer
这个服务要调用cloud-client服务中的/hello/{fallback}方法
使用@Feign(“服务名称”),接口中随便定义方法,然后@RequestMapping(“/hello/{fallback}”)即可,内部调用就是如此简单。
涉及HelloService(演示如何使用@Feign)调用服务。HelloController演示调用服务的输出结果,以及ConsumerApplication启动类。
HelloService.java
package com.xbz.eureka.demo.consumerimport org.springframework.cloud.netflix.feign.FeignClientimport org.springframework.web.bind.annotation.PathVariableimport org.springframework.web.bind.annotation.RequestMapping@FeignClient("cloud-client")public interface HelloService { @RequestMapping("/hello/{fallback}") public String hello(@PathVariable("fallback") String fallback)}
HelloController.java
package com.xbz.eureka.demo.consumerimport org.springframework.beans.factory.annotation.Autowiredimport org.springframework.web.bind.annotation.PathVariableimport org.springframework.web.bind.annotation.RequestMappingimport org.springframework.web.bind.annotation.RestController@RestControllerpublic class HelloController { @Autowired private HelloService helloServcie @RequestMapping("/test/{fallback}") public String hello(@PathVariable("fallback") String fallback){ String res=helloServcie.hello(fallback) return "调用服务结果为"+res }}
启动类ConsumerApplication.java
@EnableEurekaClient注册到Eureka
@EnableFeignClients 内部使用Feign调用服务
@EnableZuulProxy 必须要有这个注解
package com.xbz.eureka.demo.consumerimport org.springframework.boot.SpringApplicationimport org.springframework.boot.autoconfigure.SpringBootApplicationimport org.springframework.cloud.netflix.eureka.EnableEurekaClientimport org.springframework.cloud.netflix.feign.EnableFeignClientsimport org.springframework.cloud.netflix.zuul.EnableZuulProxy@SpringBootApplication@EnableEurekaClient@EnableZuulProxy@EnableFeignClientspublic class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args) }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
重要application.xml
server: port: 8080spring: application: name: cloud-consumer #为你的应用起个名字,该名字将注册到eureka注册中心eureka: instance: statusPageUrlPath: ${management.context-path}/info healthCheckUrlPath: ${management.context-path}/health client: serviceUrl: defaultZone: http://hadoopMaster:8761/eureka/ #去哪里注册,eureka服务地址
至此,我们的服务就搭建起来了!!! 按顺序启动三个类: EurekaServer ServiceApplication ConsumerApplication 正常情况下,访问http://127.0.0.1:8761
将看到如下界面 图中展示了我们启动的两个服务。 1.访问http://127.0.0.1:8080/test/1
测试服务内部调用,且失败会调用fallback方法返回值。 2.访问http://127.0.0.1:8080/test/2
测试服务内部调用,则正常调用cloud-client的服务。 3.我们可以使用统一入口,调用cloud-client服务: 访问的url:http://127.0.0.1:8761/techouse/usersystem/hello/2
以上便是一个简单的微服务搭建喽!!!