文章目錄
- 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?

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>
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
5、注冊更多的服務上去,測試使用 feign 遠端
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"));
}
}