天天看点

《分布式微服务电商》专题(七)-电商项目整合SpringCloud Alibaba

文章目录

  • ​​1.SpringCloud Aliaba简介​​
  • ​​2.为什么需要 SpringCloud Aliaba?​​
  • ​​3.最终的技术搭配方案​​
  • ​​4.项目中导入SpringCloud Alibaba依赖​​
  • ​​5.SpringCloud Alibaba - Nacos [作为注册中心]​​
  • ​​5.1、下载 nacos-server​​
  • ​​5.2、启动 nacos-server​​
  • ​​5.3、注册进入 nacos 中​​
  • ​​Nacos 使用三步​​
  • ​​6.SpringCloud Alibaba - OpenFeign​​
  • ​​6.1、导包 openfeign​​
  • ​​6.2、开启 @EnableFeignClients 功能​​
  • ​​6.3、编写接口,进行远程调用​​

1.SpringCloud Aliaba简介

Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

2.为什么需要 SpringCloud Aliaba?

《分布式微服务电商》专题(七)-电商项目整合SpringCloud Alibaba
《分布式微服务电商》专题(七)-电商项目整合SpringCloud Alibaba

SpringClouid的几大痛点:

SpringCloud部分组件停止维护和更新,给开发带来不便;

SpringCloud部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制

SpringCloud配置复杂,难以上手,部分配置差别难以区分和合理应用

SpringCloud Alibaba的优势:

阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来大家用

成套的产品搭配完善的可视化界面给开发运维带来极大的便利

搭建简单,学习曲线低。

3.最终的技术搭配方案

SpringCloud Alibaba - Nacos : 注册中心 (服务发现/注册)

SpringCloud Alibaba- Nacos: 配置中心 (动态配置管理)

SpringCloud - Ribbon: 负载均衡

SpringCloud - Feign: 声明式HTTP客户端(调用远程服务)

SpringCloud Alibaba - Sentinel: 服务容错(限流、降级、熔断)

SpringCloud - Gateway: API 网关 (webflux 编程模式)

SpringCloud - Sleuth:调用链监控

SpringCloud Alibaba - Seata: 原Fescar, 即分布式事务解决方案

4.项目中导入SpringCloud Alibaba依赖

<dependencyManagement>
     <dependencies>
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-alibaba-dependencies</artifactId>
             <version>2.1.0.RELEASE</version>
             <type>pom</type>
             <scope>import</scope>
         </dependency>
     </dependencies>
 </dependencyManagement>      
《分布式微服务电商》专题(七)-电商项目整合SpringCloud Alibaba

5.SpringCloud Alibaba - Nacos [作为注册中心]

Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台,他是使用 java 编写的,需要依赖 java 环境

Nacos 文档地址: ​​https://nacos.io/zh-cn/docs/quick-start.html​​

5.1、下载 nacos-server

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

5.2、启动 nacos-server

  • cmd 运行startup.cmd 文件
  • 访问​​localhost:8848/nacos/​​
  • 使用默认的​

    ​nacos/nacos​

    ​ 登录

5.3、注册进入 nacos 中

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

<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 </dependency>      

2、在应用的 /resource /application.properties 中配置 Nacos Server地址

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://127.0.0.1:3306/goshop_sms
    driver-class-name: com.mysql.jdbc.Driver
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: goshop-coupon      

3、使用@EnableDiscoveryClient 开启服务注册发现功能

@SpringBootApplication
 @EnableDiscoveryClient
 public class ProviderApplication {

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

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

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

spring.application.name= service provider
server.port=8000      
《分布式微服务电商》专题(七)-电商项目整合SpringCloud Alibaba

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

《分布式微服务电商》专题(七)-电商项目整合SpringCloud Alibaba

Nacos 使用三步

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

6.SpringCloud Alibaba - OpenFeign

测试会员服务调用优惠券服务,查询会员的所有优惠券

6.1、导包 openfeign

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

6.2、开启 @EnableFeignClients 功能

/**
 * 1、想要远程调用别的服务
 * 1)、引入open-feign
 * 2)、编写一个接口,告诉SpringCloud这个接口需要调用远程服务
 *   1、声明接口的每一个方法都是调用哪个远程服务的那个请求
 * 3)、开启远程调用功能
 */
@EnableFeignClients(basePackages = "com.itxiongmao.goshop.member.feign")
@SpringBootApplication
@EnableDiscoveryClient
public class GoshopMemberApplication {

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

}      

6.3、编写接口,进行远程调用

package com.itxiongmao.goshop.member.feign;

import com.itxiongmao.goshop.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
/**
 * @BelongsProject: goshop
 * @BelongsPackage: com.itxiongmao.goshop.member.feign
 * @CreateTime: 2021-04-26 19:53
 * @Description: TODO
 */

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 这是一个声明式的远程调用
 */
@FeignClient("goshop-coupon")
public interface CouponFeignService {

    @RequestMapping("/coupon/coupon/member/list")
    public R membercoupons();
}      

服务器端接口

/**
 * 测试OpenFeign
 * @return
 */
@RequestMapping("/member/list")
public R membercoupons() {
    CouponEntity couponEntity = new CouponEntity();
    couponEntity.setCouponName("满100减10");
    return R.ok().put("coupons", Arrays.asList(couponEntity));
}      
@RestController
@RequestMapping("member/member")
public class MemberController {

    @Autowired
    private MemberService memberService;

    @Autowired
    CouponFeignService couponFeignService;

    /**
     * 测试远程调用
     * @return
     */
    @RequestMapping("/coupons")
    public R test(){
        MemberEntity memberEntity = new MemberEntity();
        memberEntity.setNickname("张三");
        R membercoupons = couponFeignService.membercoupons();
        return R.ok().put("member",memberEntity).put("coupons",membercoupons.get("coupons"));
    }
}