分布式组件 SpringCloud Alibaba 、SpringCloud
一、SpringCloud Alibaba
阿里18年开发的微服务一站式解决方案。
二、Nacos 注册中心
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
作为我们的注册中心和配置中心。
注册中心文档:
使用步骤:
前提,已开启 nacos客户端
Linux/Unix/Mac 操作系统,执行命令 sh startup.sh -m standalone
Windows 操作系统,执行命令 cmd startup.cmd
1、首先,修改 pom.xml 文件
引入 Nacos Discovery Starter。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2、启动项添加 @EnableDiscoveryClient
开启服务注册与发现功能
3、配置文件中配置 Nacos Server 地址
在 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址(或在yaml中按格式配置)
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
4、http://127.0.0.1:8848/nacos/
账号密码 :nacos
如果没发现服务,需配置服务名 properties 里面
spring.application.name=name001
三、OpenFeign 远程调用
声明式远程调用
feign是一个声明式的HTTP客户端,他的目的就是让远程调用更加简单。给远程服务发的是HTTP请求。
1、引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、服务
第一个项目 coupon
@RequestMapping("coupon/coupon")
public class CouponController {
@Autowired
private CouponService couponService;
@RequestMapping("/member/list")
public R membercoupons(){
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满100-10");//优惠券的名字
return R.ok().put("coupons",Arrays.asList(couponEntity));
}
}
第二个项目 member
配置类上加注解@EnableDiscoveryClient
告诉member是一个远程调用客户端,member要调用东西的
/*
* 想要远程调用的步骤:
* 1 引入openfeign
* 2 编写一个接口,接口告诉springcloud这个接口需要调用远程服务
* 2.1 在接口里声明@FeignClient("gulimall-coupon")他是一个远程调用客户端且要调用coupon服务
* 2.2 要调用coupon服务的/coupon/coupon/member/list方法
* 3 开启远程调用功能 @EnableFeignClients,要指定远程调用功能放的基础包
* */
@EnableFeignClients(basePackages="....member.feign") //包下的 feign文件夹
@EnableDiscoveryClient
@SpringBootApplication
public class gulimallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(gulimallMemberApplication.class, args);
}
}
对应的 coupon接口
@FeignClient("gulimall-coupon") //告诉spring cloud这个接口是一个远程客户端,要调用coupon服务,再去调用coupon服务/coupon/coupon/member/list对应的方法
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list")//注意写全优惠券类上还有映射//注意我们这个地方不熟控制层,所以这个请求映射请求的不是我们服务器上的东西,而是nacos注册中心的
public R membercoupons();//得到一个R对象
}
memeber 写一个测试请求
@RestController
@RequestMapping("member/member")
public class MemberController {
@Autowired
private MemberService memberService;
@Autowired
CouponFeignService couponFeignService;
@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"));
}
启动服务,OK!!
四、Nacos 配置中心
我们还可以用nacos作为配置中心。
配置中心的意思是不在application.properties等文件中配置了,而是放到nacos配置中心公用,这样无需每台机器都改。
1、引入配置中心依赖,放到common中
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、bootstrap.properties 设置变量
在coupons项目中创建/src/main/resources/bootstrap.properties ,这个文件是springboot里规定的,他优先级别application.properties高
# 改名字,对应nacos里的配置文件名
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
以前更改properties 每次都要重新部署
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
@Autowired
private CouponService couponService;
@Value("${coupon.user.name}")//从application.properties中获取//不要写user.name,他是环境里的变量
private String name;
@Value("${coupon.user.age}")
private Integer age;
@RequestMapping("/test")
public R test(){
return R.ok().put("name",name).put("age",age);
}
# coupon.properties
coupon.user.name="配置中心"
coupon.user.age=12
3、修改肿么办?
实际生产中不能重启应用。在coupon的控制层上加 @RefreshScope
4、浏览器去nacos里的配置列表,
- 点击+号
- data ID:coupon.properties,配置详细信息
- 重启后,在nacos浏览器里修改配置,修改就可以观察到能动态修改了
- nacos的配置内容优先于项目本地的配置内容。
配置中心进阶
在nacos浏览器中还可以配置:
-
命名空间:用作配置隔离。(一般每个微服务一个命名空间)
- 默认public。默认新增的配置都在public空间下
- 开发、测试、开发可以用命名空间分割。properties每个空间有一份。
- 在bootstrap.properties里配置
# 可以选择对应的命名空间 # 写上对应环境的命名空间ID spring.cloud.nacos.config.namespace=b176a68a
- 也可以为每个微服务配置一个命名空间,微服务互相隔离
-
配置集:一组相关或不相关配置项的集合。
-
配置集ID:类似于配置文件名,即Data ID
-
配置分组:默认所有的配置集都属于DEFAULT_GROUP。双十一,618,双十二
# 更改配置分组
spring.cloud.nacos.config.group=DEFAULT_GROUP
最终方案:每个微服务创建自己的命名空间,然后使用配置分组区分环境(dev/test/prod)
五、Gateway 网关
网关常用功能包括路由转发、权限效验、限流控制。(路由、断言、过滤器)
SpringCloud Gateway 官方推出的第二代网关,取代了第一代网关Zuul
1、开启服务注册与发现
@EnableDiscoveryClient
排除 DataSouse数据源
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
2、示例:
yaml
spring:
cloud:
gateway:
routes:
- id: test_route
uri: https://www.baidu.com
predicates:
- Query=url,baidu
访问 http://localhost:88/hello?url=du
,带有baidu跳转页面
原文:分布式组件 SpringCloud Alibaba 、SpringCloud_com-alibaba-cloud和spring-cloud-CSDN博客
作者: 小心仔