SpringCloud之Netfix微服务应用框架详解_天天快报
当服务出现异常情况时,服务本身可以触发熔断,直接返回统一的错误;另外一个是消费方,这种情况下熔断有了另外一个名词,也叫降级,一般是服务方不能正常提供服务,比如访问超时,或者主动断开服务的情况下,消费方做出的反应,这种压根就不会向服务提供方发起请求。
SpringCloud是目前微服务转型的首选,主要得益于其活跃的社区支持度以及全量的配套组件,本章笔者将会把SpringCloud Netfix的几个核心组件组合起来,和老铁们一起逐步完成全套的应用框架搭建,这样有需要的老铁们在项目中就可以直接使用啦。
在SpringCloud Netfix中,核心的组件包括:注册中心(Eureka)、负载均衡(Ribbon)、服务调用(Feign)、熔断及降级(Hystrix)、网关(Gateway)、配置中心(Config)、链路追踪(Sleuth)等几大组件。我们都知道SpringCloud是基于SpringBoot整出来的微服务框架,换言之在开发SpringCloud微服务的时候,咱就少不了要使用SpringBoot,所以这里的整合SpringCloud也就遵循了SpringBoot的某种整合的规范,比如对于依赖的引用就遵守:spring-cloud-starter-xxx这种规范,这里的xxx值得就是咱们使用的组件,比如如果咱们需要整合Ribbon,那它的依赖名称就是spring-cloud-starter-netflix-ribbon。
(资料图片)
首先笔者将应用的整体情况做如下介绍:
1.应用的整体架构图:
2.使用的SpringCloud的版本是Hoxton.SR9,老铁们可以根据自己需要选择版本。
3.微服务的代码层级关系
其中parent为所有模块的父依赖,主要管理公共依赖;common是各个模块都需要用到的一些通用类;springcloud-demo-eureka-service则是eureka注册中心以及配置中心;global-gateway是网关;order-demo和product-demo是具体的服务。
4.JDK版本笔者用的是JDK1.8。
5.需要提前下载zipkin服务,下载地址大家到网上搜,下载后执行:java -jar zipkin.jar启动即可,然后访问:http://localhost:9411/zipkin/看看能否正常访问,正常情况下访问显示如下:
6.登录到github上,创建一个服务,比如笔者这里创建了springcloud-demo-config的服务,用于存放配置文件。
7.启动顺序:注册中心和配置中心->服务提供者->消费者->网关。
接下来就看每个模块的代码了:
1.parent
parent的主要作用是管理公共的依赖,核心就是一个pom.xml文件,需要注意的是,它的parent是spring-boot-starter-parent:
org.springframework.boot spring-boot-starter-parent 2.3.6.RELEASE my.springcloud.demo parent 0.0.1-SNAPSHOT pom 8 Hoxton.SR9 product-demo springcloud-demo-eureka-service order-demo springcloud-demo-eureka-service2 common global-gateway org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import my.springcloud.demo common 0.0.1-SNAPSHOT org.springframework.boot spring-boot-maven-plugin
2.eureka+config
该模块主要是注册中心和配置中心。
2.1.依赖
org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-netflix-eureka-server org.springframework.cloud spring-cloud-config-server
它主要的两个依赖是spring-cloud-config-server和spring-cloud-starter-netflix-eureka-server。
2.2.配置文件
它的配置文件application.properties如下:
server.port=8761spring.application.name=springcloud-demo-eureka-service#最好取个名字,方便区分eureka.instance.instance-id=springclouddemo1.com#false不注册自己,当然也可以设置为true,注册自己eureka.client.register-with-eureka=false#config服务使用git存储数据,这里配置git仓库的地址spring.cloud.config.server.git.uri=https://github.com/xxxx/springcloud-demo-config.gitspring.cloud.config.server.git.username=xxxxxx@126.comspring.cloud.config.server.git.password=xxxxxxxx#指定仓库分支spring.cloud.config.server.git.default-label=mastereureka.instance.prefer-ip-address=true
2.3.启动类注解
在启动类上增加三个注解:@EnableEurekaServer @SpringBootApplication @EnableConfigServer。
3.gateway
网关作为作为应用的入口,它的主要作用就是请求转发、统一验证、路由、限流等,这里我们通过网关向后台应用转发。作为访问的入口,网关同时也应该是调用链路的发起者。
3.1.依赖
org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.cloud spring-cloud-starter-gateway org.springframework.cloud spring-cloud-starter-zipkin org.springframework.cloud spring-cloud-starter-config
3.2.在配置文件bootstrap.yml中指定配置服务
spring: application: name: global-gateway cloud: config: uri: http://localhost:8761 label: master
3.3.远程仓库配置文件
这里我们使用的是配置中心的远程配置,所以在git仓库的springcloud-demo-config.git应用下,添加gateway的配置文件:global-gateway-${active}.properties,指定注册中心、zipkin的地址,同时配置网关自动发现,内容如下:
spring.application.name=global-gatewayserver.port=9006eureka.client.fetch-registry=trueeureka.client.register-with-eureka=trueeureka.client.service-url.defaultZone=http://localhost:8761/eureka/#配置网关自动发现spring.cloud.gateway.discovery.locator.enabled=truespring.zipkin.base-url=http://localhost:9411/spring.sleuth.sampler.probability=1
3.4.启动类注解
然后在启动类上添加如下注解:
@SpringBootApplication@EnableDiscoveryClient
通过网关访问时通过指定服务名和服务URL,如:
http://localhost:9006/ORDER-DEMO/order/getOrder?id=1
4.商品服务
作为具体的服务提供者,它需要往注册中心注册服务;
同时需要从配置中心读取配置文件,也就是作为配置服务的客户端;
上报调用链路数据;
4.1.依赖
org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-netflix-hystrix org.springframework.cloud spring-cloud-starter-zipkin org.springframework.cloud spring-cloud-starter-config
4.2.在配置文件bootstrap.yml中指定配置服务
spring: application: name: product-demo cloud: config: uri: http://localhost:8761 label: master
4.3.远程仓库配置文件
这里我们使用的是配置中心的远程配置,所以在git仓库的springcloud-demo-config.git应用下,添加商品服务的配置文件:product-demo-${active}.properties
spring.application.name=product-demoeureka.instance.instance-id=productdemoeureka.instance.hostname=localhostserver.port=8080eureka.client.service-url.defaultZone=http://localhost:8761/eureka/management.endpoint.info.enabled=truemanagement.endpoints.web.exposure.include=* management.endpoint.health.enabled=truemanagement.endpoint.health.show-details=alwaysmanagement.endpoint.shutdown.enabled = trueinfo.app.name=productDemoinfo.company.name=testinfo.test.tt=this is product spring.zipkin.base-url=http://localhost:9411/ spring.sleuth.sampler.probability=1
4.4.启动类注解
如果需要开启熔断,则需要在启动类上增加注解:SpringBootApplication和EnableCircuitBreaker
5.订单服务
同商品服务类似,但是它需要消费商品服务,作为服务的消费者,它需要往注册中心注册服务,同时需要从注册中心同步服务信息;
同时需要从配置中心读取配置文件,也就是作为配置服务的客户端;
上报调用链路数据;
5.1.依赖
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.cloud spring-cloud-starter-netflix-ribbon org.springframework.cloud spring-cloud-starter-openfeign org.springframework.cloud spring-cloud-starter-netflix-hystrix org.springframework.cloud spring-cloud-starter-zipkin org.springframework.cloud spring-cloud-starter-config
5.2.在配置文件bootstrap.yml中指定配置服务
spring: application: name: order-demo cloud: config: uri: http://localhost:8761 label: master
5.3.远程仓库配置文件
这里我们使用的是配置中心的远程配置,所以在git仓库的springcloud-demo-config.git应用下,添加商品服务的配置文件:product-demo-${active}.properties
spring.application.name=order-demoserver.port=8081eureka.instance.hostname=localhosteureka.instance.instance-id=orderdemomanagement.endpoint.info.enabled=trueeureka.client.service-url.defaultZone=http://localhost:8761/eureka/ hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000#zipkinspring.zipkin.base-url=http://localhost:9411/spring.sleuth.sampler.probability=1
5.4.启动类注解
如果需要开启熔断,则需要在启动类上增加注解:
@SpringBootApplication@EnableHystrix
如果微服务调用使用Feign,则还需要增加@EnableFeignClients注解,并且添加接口,同时在接口上添加FeignClient注解,如笔者这里将调用PRODUCT-DEMO服务:
@FeignClient("PRODUCT-DEMO")public interface ProductFeignService { @RequestMapping("/product/getProduct") public Product getProduct(@RequestParam(value="id") Integer id);}
当然如果是想使用Ribbon调用,则需要在配置类中增加如下代码:
@Bean @LoadBalanced public RestTemplate createRestTemplate(){ return new RestTemplate(); }
使用时,直接通过如下注解方式直接注入即可使用:
@Autowiredprivate RestTemplate restTemplate;
然后编写其他代码,完成服务之间的调用,这里笔者想对熔断的使用啰嗦两句,发送熔断的地方有两个地方:一个是服务提供方,当服务出现异常情况时,服务本身可以触发熔断,直接返回统一的错误;另外一个是消费方,这种情况下熔断有了另外一个名词,也叫降级,一般是服务方不能正常提供服务,比如访问超时,或者主动断开服务的情况下,消费方做出的反应,这种压根就不会向服务提供方发起请求。
所有代码完成后,以此启动,然后通过网关访问,然后登录http://localhost:9411/,可以查看整体的调用依赖和调用链路信息,至此整体搭建完成。
标签: