SpringCloud项目学习经验
SpringCloud总结
SpringCloud由很多微服务组成,主要学了如下七个。注册中心Eureka,数据微服务,视图微服务(负载均衡Ribbon,Feign),服务及客户端配置(Git,RabbitMQ),断路器Hystrix,断路器监控hystrix-dashboard (聚合Turbine),网关Zuul。
源码地址:https://github.com/MikeChengege/SpringCloud
一、注解解释
1、声明在启动类中的
@SpringBootApplication 说明是一个springboot项目
@EnableEurekaServer 注册中心服务端
@EnableEurekaClient 表明是一个Eureka客户端,用于注册到EurekaServer
@Bean 注解用于告诉方法,产生一个Bean对象,然后这个Bean对象交给Spring管理
@EnableDiscoveryClient 用于发现eureka 注册中心的微服务(网络解释:和@EnableEurekaClient一样的功能,但是它也可以注册到非Eureka之外的服务端)
@EnableFeignClients 表示利用Feign方式, Feign 是对 Ribbon,使用更简单
@LoadBalanced 给 RestTemplate做标记,restTemplate 这个工具来做负载均衡
@EnableCircuitBreaker 表示分享信息给监控中心,用于断路器监控。
@EnableConfigServer 这个注解表示本springboot 是个配置服务器。
@EnableHystrixDashboard 表示是断路器监控类
@EnableTurbine 根据实例注册名将实例聚合方便监控
@EnableZuulProxy 表示这是一个网关服务
2、声明在其他类中
@RestController 返回ruturn的字符串,比如return “aa/bb”返回的就是aa/bbb
@Controller 返回return的指定页面路径,比如return “aa/bb”返回的就是aa/bbb这个路径下面的页面
@Autowired 自动装配,比如需要调用service层的方法,需要先装配进来。
@RequestMapping 将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上,例如@RequestMapping("/products")
@Service 自动注册到Spring容器,不需要再在applicationContext.xml文件定义bean了,类似的还包括@Component、@Repository、@Controller
@Value(“${}”) 用户获取配置文件中的或者是那个类中定义的内容(网上解释说是从配置文件中获取,可是本项目并没有在配置文件中定义,只是在类中定义过)
@component (把普通pojo实例化到spring容器中)泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。
@repository (实现dao访问)用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件
@FeignClient 用户feign客户端类,用法:@FeignClient(value = “PRODUCT-DATA-SERVICE”) ,PRODUCT-DATA-SERVICE为数据微服务名称
@GetMapping 用于处理请求方法的GET类型,同类型的还有@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping。简化了之前的操作(@RequestMapping(value = “/get/{id}”, method = RequestMethod.GET))、
@RefreshScope 配置文件自动刷新
二、微服务概述
1. 注册中心(Eureka)
- 只需要两个注解和配置文件,默认端口8761
- 访问地址:http://127.0.0.1:8761/
2. 数据服务
- 需要controller、service、model这三层,按理说也需要dao层因为开始学习数据在类中给出了。
- Controller层运用了@RequestMapping本应是后台去拿数据应该不需要,但是必须(不理解)
- Model这层在数据服务和视图服务中都要定义实体类,感觉有些麻烦但是必须。
3. 视图微服务(Feign\Ribbon)。
- Ribbon使用restTemplate来达到负载均衡,需要在启动类中声明,但是使用Feign后就不需要在启动类中声明了。Feign为Ribbon的封装
- 需要Feign客户端,是一个接口,会在service层调用,用于在数据微服务中获取数据
- Controller层用于拿出数据传递给html 。
4. 链路追踪
- 改造数据和视图微服务,分别在启动类中注入Sampler.ALWAYS_SAMPLE。
- 启动zipkin-server-2.10.1-exec.jar
- 监控地址http://localhost:9411/zipkin/dependency/
- 当支持rabbitMQ时需要加参数运行jar包。java -jar zipkin-server-2.10.1-exec.jar --zipkin.collector.rabbitmq.addresses=localhost
5. 配置服务器及客户端
- 用于云配置,只需修改一个地方同一个集群中所有微服务都可自动获取
- 先在git上创建库,在启动类注解一下
- 在配置文件中声明地址。
6. 配置客户端
- 安装rabbitMQ(不用做其他配置)
- Pom文件引入rabbitMQ包
- 使用RabbitMQ来进行消息广播,自动刷新配置文件
- 添加配置文件bootstrap.yml,修改application.yml.修改controller层
- 使用post方式访问http://localhost:8012/actuator/bus-refresh去git获取信息,然后刷新配置服务器
7. 断路器
- 用于数据微服务done掉或者出问题时不会报错,而是采用备用方案
- 新建类实现Feign客户端接口,提供数据(备用方案)
- 修改视图微服务的Feign客户端,添加回调改为:@FeignClient(value = “PRODUCT-DATA-SERVICE”,fallback = ProductClientFeignHystrix.class)
- 在配置文件中开启断路器feign.hystrix.enabled: true
8. 断路器监控(监控 hystrix-dashboard/聚合监控turbine)
- 可以看到访问情况及访问成功率等如下图
- 修改ProductViewServiceFeignApplication, 增加 @EnableCircuitBreaker
- 配置文件比较重要,需要监控那些服务都可以将服务名写在配置文件中
- 访问http://localhost:8020/hystrix监控地址,输入聚合服务的地址http://localhost:8021/turbine.stream。
9. 网关(zuul)
- 用于将数据微服务和视图微服务归类,访问者只需要记住网关的IP和端口。
- 只有启动类声明网关,配置文件中配置代理的服务名称并给出访问路径。
三、端口概览
1、微服务:
注册中心:eureka-server: 8761
数据微服务:product-data-service: 8001,8002,8003
视图微服务:product-view-service-ribbon: 8010
视图微服务:product-view-service-feign: 8012, 8013, 8014
断路器监控:hystrix-dashboard: 8020
断路器聚合监控:turbine: 8021
配置服务器:config-server: 8030
网关:zuul: 8040
2、第三方:
链路追踪:zipkin:9411
消息中间件:rabbitMQ: 5672
四、分布式、集群及各部分解释
- 哪些微服务是如何彼此调用的? sleuth 服务链路追踪
- 如何在微服务间共享配置信息?配置服务 Config Server
- 如何让配置信息在多个微服务之间自动刷新? RabbitMQ 总线 Bus
- 如果数据微服务集群都不能使用了, 视图微服务如何去处理? 断路器 Hystrix
- 视图微服务的断路器什么时候开启了?什么时候关闭了? 断路器监控 Hystrix Dashboard
- 如果视图微服务本身是个集群,那么如何进行对他们进行聚合监控? 断路器聚合监控 Turbine Hystrix Dashboard
- 如何不暴露微服务名称,并提供服务? Zuul 网关
学习资源均来自how2j.cn不错的网站,适合初学者去学一些java的东西