三、微服务分布式电商系统--SpringCloud分布式组件Nacos注册中心、配置中心、OpenFeign远程调用、GateWay网关

【摘要】

在分布式开发中,首先我们必须要知道注册中心、配置中心和网关这三个概念。
每一个微服务上线都需要将他自己注册到注册中心,这样做的好处就是如果一个服务想要调用另外一个服务,这个服务就可以去注册中心寻找哪几个服务上线了,就可以找到对应的服务调用了。各个服务的配置众多,如果商品服务在10台机器上都有,想要改配置很麻烦,有一个配置中心集中管理。前端发过来的请求经过统一的鉴权、过滤、路由等由网关抵达后台的服务,做一些预先的工作。

前言

https://spring.io/projects/spring-cloud-netflix

SpringCloud Alibaba

SpringCloud Alibaba简介

简介

Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用的必须组件,方便开发者通过Spring Cloud编程模型轻松快速使用这些组件来开发分布式应用服务。
依托Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将SpringCloud应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
https://github.com/alibaba/spring-cloud-alibaba

为什么使用它?

Spring Cloud的几大痛点:

  • SpringCloud部分组件停止维护和更新,给开发带来不便。
  • SpringCloud部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发。
  • SpringCloud配置复杂,难以上手,部分配置差别难以区分和合理使用。

Spring Cloud Alibaba的优势:

  • 阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源状态。
  • 成套的产品搭配完善的可视化界面给开发运维带来极大的便利。
  • 搭建简单,学习曲线低。

结合Spring Cloud Alibaba我们最终的技术搭配方案:

  • SpringCloud Alibaba - Nacos:注册中心(服务发现/注册)
  • SpringCloud Alibaba - Nacos:配置中心(动态配置管理)
  • SpringCloud - Ribbon:负载均衡
  • SpringCloud - Feign:声明式HTTP客户端(调用远程服务)
  • SpringCloud Alibaba - Sentinel:服务容错(限流、降级、熔断)
  • SpringCloud - Gateway:API网关(webflux 编程模式)
  • SpringCloud - Sleuth:调用链监控
  • SpringCloud Albaba -Seata:原Fescar,即分布式事务解决方案

版本选择

由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且 spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们采取跟 SpringBoot 版本号一致的版本:

  • 1.5.x版本适用于Spring Boot 1.5.x
  • 2.0.x版本适用于Spring Boot 2.0.x
  • 2.1.x版本适用于Spring Boot 2.1.x

项目中的依赖

1
2
3
4
5
6
7
8
9
10
11
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

SpringCloud Alibaba-Nacos 注册中心

参考文档:Nacos Discovery Example
Nacos 快速开始
Nacos是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。他是使用Java编写的,需要依赖Java环境。

下载nacos-server

https://github.com/alibaba/nacos/releases

启动nacos-server

  • 双击bin中的startup.cmd文件
  • 访问ip:8848/nacos/
  • 使用默认的账号密码nacos/nacos进行登录



将服务注册到nacos中

  • 1.首先,修改 pom.xml 文件,引入 Nacos Discovery Starter。

    1
    2
    3
    4
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

  • 2.在应用的 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址。

    1
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

    这里配置在yml中也可以。

  • 使用 @EnableDiscoveryClient 注解开启服务注册与发现功能。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @SpringBootApplication
    @EnableDiscoveryClient
    public class ProviderApplication {

    public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
    }

    @RestController
    class EchoController {
    @GetMapping(value = "/echo/{string}")
    public String echo(@PathVariable String string) {
    return string;
    }
    }
    }

启动应用,观察nacos服务列表

启动应用,观察nacos服务列表是否已经注册上服务。

注意:每一个应用都应该有名字,这样才能注册上去。修改application.properties文件

1
2
spring.application.name=service-provoider
server.port=8000



同样的,可以把其他服务都注册到nacos中。

注册更多的服务上去,测试使用feign远程调用

Nacos使用三步

  • 1.导包 nacos-discovery
  • 2.写配置,指定nacos地址,指定应用的名字。
  • 3.开启服务注册发现功能 @EnableDiscoveryClient。

Feign使用三步

  • 1.导包openfeign
  • 2.开启 @EnableFeignClients功能
  • 3.编写接口,进行远程调用。
    1
    2
    @RequestMapping("/coupon/coupon/member/list")
    public R membercoupons();

SpringCloud Alibaba-Nacos 配置中心

如何接入

  • 1.首先,修改 pom.xml 文件,引入 Nacos Config Starter。
    1
    2
    3
    4
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
  • 2.在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据。
    1
    2
    spring.application.name=nacos-config-example
    spring.cloud.nacos.config.server-addr=127.0.0.1:8848
  • 3.完成上述两步后,应用会从 Nacos Config 中获取相应的配置,并添加在 Spring Environment 的 PropertySources 中。这里我们使用 @Value 注解来将对应的配置注入到 SampleController 的 userName 和 age 字段,并添加 @RefreshScope 打开动态刷新功能。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @RefreshScope
    class SampleController {

    @Value("${user.name}")
    String userName;

    @Value("${user.age}")
    int age;
    }



在nacos中配置

登录nacos控制台 → 配置服务 → 配置列表 → + 添加配置:

发布之后再次访问。


总结

SpringCloud Alibaba-Sentinel

SpringCloud Alibaba-Seata

SpringCloud Alibaba-OSS

SpringCloud

Feign声明式远程调用

简介

Fegin是一个声明式的HTTP客户端,它的目的就是让远程调用更加简单。Fegin提供了HTTP请求模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。
Fegin整合了Ribbon(负载均衡)和Hystrix(服务熔断),可以让我们不再需要显式地使用这两个组件。
SpringCloudFeign在NetflixFeign的基础上扩展了对SpringMVC注解的支持,在其实现下,我们只需要创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定。简化了SpringCloudRibbon自行封装服务调用客户端的开发量。

使用

  • 1.引入依赖

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
  • 2.开启feign功能

    1
    @EnableFeignClients(basePackages = "com.aiz.zhelimall.member.feign")
  • 3.声明远程接口

    1
    2
    3
    4
    5
    @FeignClient("zheli-coupon")
    public interface CouponFeignService {
    @RequestMapping("/coupon/coupon/member/list")
    public R memberCoupons();
    }




GateWay

简介

网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。而spring cloud gateway作为SpringCloud官方推出的第二代网关框架,取代了Zuul网关。
网关提供API全托管服务,丰富的API管理功能,辅助企业管理大规模的API,以降低管理成本和安全风险,包括协议适配、协议转发。安全策略、防刷、流量、监控日志等功能。
Sprin Cloud GateWay旨在提供一种简单而有效的方式来对API进行路由,并为他们提供切面,例如:安全性,监控/指标和弹性等。
官方文档地址:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.3.RELEASE/reference/html/

核心概念

使用

  • IDEA中创建项目
    • 在IDEA中File->Module->Spring Initializr点进Next->…
    • 导入依赖、开启服务注册发现功能、启动配置Nocas
  • 断言(Predicate)
  • 过滤器(Filter)



新建bootstrap.properties文件。

在nacos中新建命名空间gateway。

在启动的时候排除数据源。

新建application.yml配置网关

访问下面的地址,运行测试。

1
2
http://localhost:88/hello?url=qq
http://localhost:88/hello?url=baidu

Sleuth+Zipkin服务链路追踪

结束语

评论