天天看點

《分布式微服務電商》專題(七)-電商項目整合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"));
    }
}