文章目录
- 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"));
}
}