在微服务架构中,首先,项目要拆分为多个微服务,每个微服务发布时,又会部署为多个实例。从而形成大量微服务实例。
实例的管理
配置的管理
服务之间的访问
采用admin-server来管理上述大量的微服务实例。
采用配置服务器,统一管理配置文件,所有微服务从配置服务器上获取其配置,其自身不再需要配置。
管理所有springboot应用实例,并提供图形化界面显示其状态和参数,方便运维管理。
/SpringBootAdmin
如果仅仅在eclipse等工具中启动adminserver,则仅需要如下依赖即可
如果要打包jar,则需要
/SpringBootAdmin/src/main/resources/application.yml
/SpringBootAdmin/src/main/java/com/qfedu/demo/springboot/admin/AdminApplication.java
将本项目作为一个微服务实例,纳入adminserver的管理,也就是说,adminserver既当管理者,也作为被管理对象。
下面配置,可以将某个springboot应用纳入adminserver的管理。
Adminserver引入了依赖actuator
其作用是,将springboot应用的信息通过/health暴露出来
Consumer
Orders
根据id获取客户信息
URL:/consumer/{id}
返回:{“id”:“1”,“name”:“张三”}
所有配置在本地。
searchLocations配置各个项目的配置文件的搜索路径
参考上节,需要新建一个bootstrap.xml配置:
配置pom.xml
首先启动配置服务器,然后启动consumerservice项目
http://localhost:8888/consumerservice/default
其内容对应:
/springcloud-config/src/main/resources/config/consumerservice/consumerservice.yml
http://localhost:8888/consumerservice/dev
其内容对应:
/springcloud-config/src/main/resources/config/consumerservice/consumerservice-dev.yml
Springcloud采用Netflix开发eureka作为注册中心。
/springcloud-eureka/src/main/resources/application.yml
/springcloud-eureka/src/main/java/com/qfedu/demo/springcloud/eureka/EurekaApplication.java
改造consumerservice使其可以在注册中心注册
/springcloud-config/src/main/resources/config/consumerservice/consumerservice.yml
/springcloud-consumer/src/main/java/com/qfedu/demo/springcloud/consumer/ConsumerApplication.java
启动配置服务器
启动eureka
启动consumerservice
访问http://localhost:8761/eureka/apps/
即可查看eureka上已经注册的服务
访问http://localhost:8761/eureka/apps/consumerservice
即可查看已经注册的consumerservice服务
将adminserver注册到eureka中即可。
/SpringBootAdmin/src/main/resources/application.yml
/SpringBootAdmin/src/main/java/com/qfedu/demo/springboot/admin/AdminApplication.java
完成订单微服务,提供/order/{id}接口,最终返回包括客户信息的订单数据。
根据订单id,到数据库查询订单数据;
根据订单中的客户id,调用客户微服务,获取客户信息,然后返回。
/springcloud-config/src/main/resources/application.yml
/springcloud-config/src/main/resources/config/orderservice/orderservice.yml
/springcloud-order/src/main/resources/bootstrap.yml
/springcloud-order/src/main/java/com/qfedu/demo/springcloud/order/OrderApplication.java
/springcloud-order/src/main/java/com/qfedu/demo/springcloud/order/service/impl/OrderServiceImpl.java
/springcloud-order/src/main/java/com/qfedu/demo/springcloud/order/mapper/OrderMapper.java
/springcloud-order/src/main/resources/mapper/OrderMapper.xml
启动配置服务器
启动注册中心
启动客户服务
启动订单服务OrderApplication
测试客户服务:
测试订单服务:
项目名称:/springcloud-order-discovery-client
拷贝/springcloud-order项目的代码和配置
/springcloud-order-discovery-client/pom.xml
/springcloud-order-discovery-client/src/main/java/com/qfedu/demo/springcloud/order/OrderDiscoveryClientApplication.java
/springcloud-order-discovery-client/src/main/java/com/qfedu/demo/springcloud/order/service/impl/OrderServiceImpl.java
启动配置服务器
启动注册中心
启动客户服务
启动订单服务OrderDiscoveryClientApplication
测试客户服务:
测试订单服务:
项目名称:/springcloud-order-ribbon
拷贝/springcloud-order项目的代码和配置
/springcloud-order-ribbon/pom.xml
/springcloud-order-ribbon/src/main/java/com/qfedu/demo/springcloud/order/OrderRibbonApplication.java
@LoadBalaced表示采用ribbon做客户端负载均衡zu
/springcloud-order-ribbon/src/main/java/com/qfedu/demo/springcloud/order/service/impl/OrderServiceImpl.java
启动配置服务器
启动注册中心
启动客户服务
启动订单服务OrderRibbonApplication
测试客户服务:
测试订单服务:
客户端负载均衡:请求方和代理在一个进程中
服务端负载均衡:请求放和代理分别是不同的服务器
声明式负载均衡(服务发现)
项目名称:/springcloud-order-feign
拷贝/springcloud-order项目的代码和配置
/springcloud-order-feign/pom.xml
/springcloud-order-feign/src/main/java/com/qfedu/demo/springcloud/order/OrderFeignApplication.java
/springcloud-order-feign/src/main/java/com/qfedu/demo/springcloud/order/service/impl/OrderServiceImpl.java
/springcloud-order-feign/src/main/java/com/qfedu/demo/springcloud/order/service/client/ConsumerFeignClient.java
启动配置服务器
启动注册中心
启动客户服务
启动订单服务OrderFeignApplication
测试客户服务:
测试订单服务:
雪崩效应:某个服务的性能问题,传播到整个系统,导致整个系统崩溃。
客户端弹性
服务降级:服务B调用服务A,当发现A已经死亡或者性能有问题,采用备选方案,暂时不去调用服务A。过段时间再重新尝试调用。
服务降级如果没有备选方案,则这种模型为断路器(服务熔断)。
服务降级和统一异常处理的区别:
当服务调用出现异常或者响应较慢时,采用备选方案;
统一异常处理,是当controller抛出异常时,执行指定的代码。
服务降级或者熔断,不一定仅仅应用在远程服务调用,也可以应用在本地资源调用(数据库)。
雪崩效应
客户端弹性:当服务调用出现异常或者响应较慢时,采用一定的方案
服务降级(后备) 、断路器(服务熔断)、舱壁(隔离)
项目名称:/springcloud-order-hystrix
拷贝/springcloud-order-ribbon项目的代码和配置
/springcloud-order-hystrix/pom.xml
/springcloud-order-hystrix/src/main/java/com/qfedu/demo/springcloud/order/OrderHystrixApplication.java
/springcloud-order-hystrix/src/main/java/com/qfedu/demo/springcloud/order/controller/OrderController.java
启动配置服务器
启动注册中心
启动客户服务
启动订单服务OrderHystrixApplication
测试订单服务:
停止客户服务,继续调用订单服务
/springcloud-order-hystrix/src/main/java/com/qfedu/demo/springcloud/order/controller/OrderController.java
随机sleep三秒(不是必须)。
如果需要修改客户端弹性的超时时间,则进行如下设置:
execution.isolation.thread.timeoutInMilliseconds
启动配置服务器
启动注册中心
启动客户服务
启动订单服务OrderHystrixApplication
测试订单服务:
随机出现下面两个结果之一:
com.netflix.hystrix.exception.HystrixRuntimeException
在默认情况下,当请求微服务接口时,hystrix会启动一个线程池,来处理并发的请求。
当高并发发生时,由于响应较慢的接口和响应较快的接口公用同一个线程池,从而导致慢接口会更多的占用线程,而快接口无线程可用,从而拖垮快接口。
此时,可以采用舱壁模式,给慢接口设置单独的线程池,从而隔离它。
项目名称:/springcloud-order-feign-hystrix
拷贝项目/springcloud-order-feign的代码和配置
启动配置服务器
启动注册中心
启动客户服务
启动订单服务OrderFeignHystrixApplication
测试订单服务:
停止客户服务,继续调用订单服务
Zuul充当服务路由器的作用,将服务请求反向代理到实际的服务上,实现服务端负载均衡;
因为所有的服务调用都要通过Zuul,所以可以用它来完成日志和服务跟踪。
/springcloud-zuul
/springcloud-zuul/src/main/java/com/qfedu/demo/springcloud/zuul/ZuulApplication.java
/springcloud-zuul/src/main/resources/bootstrap.yml
/springcloud-config/src/main/resources/config/zuulservice/zuulservice.yml
/springcloud-config/src/main/resources/application.yml
项目名称:/springcloud-order-zuul
拷贝项目/springcloud-order-ribbon的代码和配置
/springcloud-order-zuul/src/main/java/com/qfedu/demo/springcloud/order/service/impl/OrderServiceImpl.java
启动配置服务器
启动eureka服务器
启动zuul服务器
启动客户服务器
启动订单服务器OrderZuulApplication
/springcloud-config/src/main/resources/config/zuulservice/zuulservice.yml
/springcloud-order-zuul/src/main/java/com/qfedu/demo/springcloud/order/service/impl/OrderServiceImpl.java
启动配置服务器
启动eureka服务器
启动zuul服务器
启动客户服务器
启动订单服务器OrderZuulApplication
/springcloud-config/src/main/resources/config/zuulservice/zuulservice.yml
/springcloud-order-zuul/src/main/java/com/qfedu/demo/springcloud/order/service/impl/OrderServiceImpl.java
启动配置服务器
启动eureka服务器
启动zuul服务器
启动客户服务器
启动订单服务器OrderZuulApplication
/springcloud-config/src/main/resources/config/zuulservice/zuulservice.yml
/springcloud-order-zuul/src/main/java/com/qfedu/demo/springcloud/order/service/impl/OrderServiceImpl.java