SpringCloud学习案例讲解

本人之前所在单位使用的中台系统即为传统的SpringCloud架构,项目是很多年前搭建的,版本较为老旧,基于SpringBoot 1.5.3,SpringCloud Dalston.SR1。目前这个项目即将停止维护,以后会被新的项目替代。由于公司的项目不方便细讲,我在github上找了个类似架构的项目(https://github.com/forezp/springcloud-book/),是《深入理解SpringCloud与微服务构建》这本书最后一章节的示例项目。这里就以这个项目为蓝本,讲下我的学习过程和对SpringCloud各个组件的理解。

 

 很显然,这是个多Module的项目,其中带蓝点的,除了common是公共库之外,其余每一个都是可以单独启动的项目。

一、注册与配置中心

注册中心为eureka-server,配置中心为config-server,这个大家应该很熟悉了。首先编写eureka-server,启动类加上@EnableEurekaServer,并且在配置文件里设置为不注册自身。想要注册到eureka-server的服务,只要将eureka-server的地址写到自己项目下的application.yml文件里,然后在启动类加上注解@EnableEurekaClient就行了。

配置中心config-server,可以从本地仓库读取配置,也可以从远程git仓库读取。config-server也需要注册到eureka,所以一般先启动eureka-server。另,如使用SpringCloud Bus刷新配置,需要先部署rabbitmq。

二、监控

1. admin-service

Spring Boot Admin是一个开源项目,用于监管Spring Boot程序的。分为客户端和服务端,客户端和服务端之间采用http交互数据。单体项目需要整合spring-boot-admin-client,在SpringCloud中server直接从注册中心抓取应用信息,不需要整合。

启动类加上@EnableAdminServer和@EnableEurekaClient。另外本案例中admin-service还整合了Spring Boot Admin Server会请求注册列表里服务Actuator的API接口(被监控的应用需要引入actuator依赖),从而获取服务监控信息。@EnableTurbine默认开启Turbine,Turbine会聚合每个Hustrix dashboard的信息。

2. monitor-service

将user-service,blog-service的Hystrix dashboard聚合到一起。启动类注解如下所示:

@SpringBootApplication
@EnableTurbine
@EnableHystrixDashboard
@EnableHystrix

在Dalston版本中,Feign的Hystrix默认不开启,需要在工程的配置文件里加上feign_hystrix=true

三、网关

使用Zuul网关,实现路由转发、过滤、鉴权。该案例使用了路由转发功能,配置如下

zuul:
  host:
    connect-timeout-millis: 20000
    socket-timeout-millis: 20000

  routes:
    user-service:
      path: /userapi/**
      serviceId: user-service
      sensitiveHeaders:

    blog-service:
      path: /blogapi/**
      serviceId: blog-service
      sensitiveHeaders:

外部的请求直接发到Zuul,Zuul根据Url匹配,将请求转到对应的服务。这样做,可以避免多次调用重复鉴权、避免了跨域,也避免了因为SpringCloud内部服务变动导致的外部请求业务跟着需要改动的麻烦。

四、业务应用

1. user-service

应用程序启动类分别加上如下注解:

@SpringBootApplication
@EnableEurekaClient //注册为Eureka客户端
@EnableFeignClients //允许使用Feign进行服务调用
@EnableHystrixDashboard  // 开启Hystrix面板
@EnableHystrix //使用Hystix作为断路器

调用其它服务比如uaa-service,先编写一个对应的Client接口,加上注解

@FeignClient(value = "uaa-service",fallback=AuthServiceHystrix.class )

然后编写一个fallback降级处理类,用来直接返回固定内容

@Component
public class AuthServiceHystrix implements AuthServiceClient {
    @Override
    public JWT getToken(String authorization, String type, String username, String password) {
        System.out.println("--------opps getToken hystrix---------");
        return null;
    }
}

如果需要限制外部请求(请求user-service的接口),需要编写HystrixCommand的实现类,使用注解添加到对应接口。

 

posted @ 2022-03-10 23:21  方山客  阅读(127)  评论(0编辑  收藏  举报