个人piggymetrics学习笔记

391 阅读7分钟

这个是我自己通过piggymetrics这个项目学习springcloud记录的笔记,瞎写的。

Spring Cloud

Spring Cloud是一个分布式的框架。

在学习的时候经常看见微服务和分布式,关于这两者 我目前的理解就是:

  1. 分布式:是一种部署方法,他将一个整体模块拆分成多个模块分别部署。比如说一个电商项目,它将用户、商品、订单拆出来分别作为一个独立的模块来运行,在有需要的时候再通过其他模块提供的接口来调用实现不同模块之间的协调。
  2. 微服务:就是一种设计思想,将一个系统拆分缩小成一个个更小更独立的项目,不同项目通过通过通信协议进行通信。
  3. 我看来分布式可以算是微服务的一种具体实现。

这个项目的大体框架如下:

image.png 从图中看到客户端通过API GETWAY来调用三个不同的功能模块,然后还有一些其他的模块来辅助使得整个项目可以正常运行。

Spring Cloud Config

在它的readme文件中提到了Config Service,这里是使用Spring Cloud Config来实现的,SCC可以先将配置项通过git上传到云端,在启动项目的时候云端获取并保存到本地,之后其他的功能部分通过自己的配置文件的内容来获取到自己的真正的配置内容了。

为什么要这样子?

明明在各个功能模块上写就可以使项目正常运行了为什么还要单独使用SCC来进行config的保存?

这个原因在网上找能找到很多,但我自己目前能体会到的就这几点:

  1. 在实际的项目中同一个功能模块会部署到很多不同的机器上形成集群,或者是有很多不同端口的项目,这些功能模块的配置基本上都是一样的,如果有要修改的部分会很麻烦,因为不仅所有的都要改,而且一旦多起来就有可能会出现遗漏。
  2. 提供一个统一配置的地方可以提高灵活性,通过将配置信息存储在配置项目中,可以实现配置的动态加载和更新。
  3. 安全性:一些配置信息是敏感的,通过这种方法可以使认证通过的用户获取配置信息,其他用户无法获取,进而保护信息的安全。

怎么使用?

首先这里要将服务分成客户端和服务端两种类型,服务端就是提供config详情的配置项目,客户端就是其他的功能项目。

服务端:

在pom文件中添加依赖:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-config-server</artifactId>
</dependency>

之后再在服务端上编写配置文件:application.yml

内容中要有具体的配置文件在哪里。比如放到了git云端上,那么就会通过给的地址下载下来保存到本地的仓库中,在本项目中是直接存放到了本地中:

spring:
  cloud:
    config:
      server:
        native:
          search-locations: classpath:/shared

在启动类上要添加 @EnableConfigServer 注解

之后config项目(服务端)就能正常运行了。

客户端

客户端使用的依赖是:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

之后的配置文件名要求是:bootstrap.yml

项目中auth-serve模块的bootstrap.yml内容是:

spring:
  application:
    name: auth-service
  cloud:
    config:
      uri: http://config:8888
      fail-fast: true
      password: ${CONFIG_SERVICE_PASSWORD}
      username: user

这里好像是通过name项来获取对应的文件的,password和username就是用于角色权限的校验。 我看其他文章里是使用 spring.cloud.config.name来获取配置文件的名称。之后还有一些其他的配置。 url:就是来指向从哪里还获取配置文件。

找了一篇简洁和全面的配置文章:SpringCloud学习系列之四-----配置中心(Config)使用详解 - 虚无境 - 博客园 (cnblogs.com)

身份认证服务

需求分析:分布式的项目将功能拆开实现不同的功能,而很多分布式项目都用用户相关功能要实现,比如电商系统的商品、订单、物流等都需要用户,由于功能是分开的,每次调用都需要使用用户的信息才行,这样我们就需要进行用户身份的校验,否则可能会出现问题。但每个模块写上用户身份校验功能会非常冗余,考虑分布式的特点,我们可以单独写一个用户校验的功能模块供其他模块调用。

本项目选择使用OAuth2来实现身份认证服务。

项目如何实现的

项目编写了auth-serve模块来实现,首先是在pom文件中添加依赖。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>

之后单独编写一个java类实现相关的配置。OAuth2AuthorizationConfig 并添加@Configuration和@EnableAuthorizationServer注解并继承AuthorizationServerConfigurerAdapter来配置。

image.png

之后按照自己的需求重写继承类的方法并且添加一些自己需要用到的方法。

之后还要写一个安全配置类,继承WebSecurityConfigurerAdapter类。 主要是两部分:

@Override
@Bean
//认证管理器
public AuthenticationManager authenticationManagerBean() throws Exception {
    return super.authenticationManagerBean();
}
//安全拦截机制
@Override
protected void configure(HttpSecurity http) throws Exception {
    // @formatter:off
    http
            .authorizeRequests().anyRequest().authenticated()
            .and()
            .csrf().disable();
    // @formatter:on
}

到这里项目的OAuth2部分编写完成,其他的功能部分要想使用就要在相关方法上添加@PreAuthorize注解。文档的说法是:每个PiggyMetrics客户端都有一个范围:server用于后端服务和 ui用于浏览器。我们可以使用注释来保护控制器免受外部访问:@PreAuthorize。使用如下:

@PreAuthorize("#oauth2.hasScope('server')")

功能项目启动类上好像要需要添加@EnableOAuth2Client注解

网关

API网关是这个系统的单个进入点,用于处理请求并将其路由到相应的后端服务。它是一个充当前端和后端服务之间的中间层,为客户端提供统一的入口点,用于管理、保护和路由所有的API请求。

该项目使用zuul作为网关的实现。

使用

同样要添加依赖

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

之后再在zuul的启动类上添加注解:@EnableZuulProxy。 最后要在配置文件上写好路由匹配规则(项目中是使用了Spring Cloud Config)。

服务发现

服务发现是一种机制,用于动态地发现和注册可用的服务实例。它为服务间的通信提供了重要支持。

比如说一个商城购物系统如果没有服务发现机制的话订单模块想要修改商品的数量这个功能实现就需要再订单模块上编写上商品模块的访问路径。单单这一个例子还好,但实际上的分布式框架有很多种服务,如果都这样就会造成冗余杂乱,而且如果一个模块修改了访问路径或其他需要其他模块修改的内容的话,那么所有相关模块都需要进行修改,难免会出现差错。

但使用服务发现机制就不会这样了。我们将该服务在服务发现平台上注册,当其他服务想要调用我们的时候只要通过服务发现平台就能知道如何调用了,当我们发生了修改也只需要在平台上修改即可,不必大费周章地修改所有相关的配置内容。

该项目使用Eureka来实现的服务发现功能。

Eureka分为服务端和客户端两部分。服务端用于提供服务注册功能。客户端会从服务端中调用自己需要的功能。

简单使用

服务端

本项目的服务端是registry包

服务端需要的依赖配置是:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

在启动类上方加上@EnableEurekaServer注解,向应用解释我是一个服务端。 之后就要在yml文件中配置eureka相关的内容。

配置成功后就能在eureka的网页上查看注册的功能。

客户端

项目的客户端的启动类使用@EnableDiscoveryClient注解同时在bootstrap.yml中添加服务名称。如下:

spring:
  application:
    name: notification-service

负载均衡、熔断服务、HTTP客户端

分别使用Ribbon、Hystrix、Feign来实现。