springcloudAlibaba
替代方案:
SpringCloud Alibaba - Nacos :注册中心(服务发现/ 注册)
SpringCloud Alibaba - Nacos :配置中心(动态配置管理)
SpringCloud - Ribbon :负载均衡
SpringCloud - Feign :声明式 HTTP 客户端(调用远程服务)
SpringCloud Alibaba - Sentinel :服务容错(限流、降级、熔断)
SpringCloud - Gateway :API 网关(webflux 编程模式)
SpringCloud - Sleuth :调用链监控
SpringCloud Alibaba - Seata原 :原 Fescar
springcloud、springboot版本对应的springcloudAlibaba版本
1、服务的注册与发现(nacos)
在 common 项目中引入如下。进行统一管理
1、
<!--springcloudalibaba-->
<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>
2、nacos引入服务注册与发现
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3、下载nacos
https://github.com/alibaba/nacos/releases?page=4
下载完毕点击启动
4、使用nacos:
每个微服务,配置注册中心地址
application.yml
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
5、 使用@EnableDiscoveryClient开启服务注册与发现
GulimallCouponApplication
package com.ljs.gulimall.coupon;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class GulimallCouponApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallCouponApplication.class, args);
}
}
6、启动服务。然后看服务有无注册到注册中心
http://localhost:8848/nacos
用户名密码:nacos
###微服务必须指定微服务名称,才可以注册到注册中心
说明已经注册进来
其他服务同理
2、服务间远程调用(openFeign)
场景:会员获取优惠券
会员服务远程调用优惠券服务
1、引入openFeign组件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、在优惠券服务编写一个接口,告诉springcloud、member服务需要进行远程调用
/**
* 获取优惠券信息
*
* @return R
*/
@RequestMapping("/getCoupon")
public R list(){
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满一万减一块");
return R.ok().put("coupon",Arrays.asList(couponEntity));
}
3、member服务建立feign包
CouponFeignService
package com.ljs.gulimall.member.feign;
import com.ljs.gulimall.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/getCoupon")
public R list();
}
调用哪个接口,完整复制过来
声明接口的每个方法都是调用哪个远程服务的哪个请求
4、开启远程调用
在member的启动类上增加
@EnableFeignClients(basePackages = “com.ljs.gulimall.member.feign”)
5、之后就可以在member的任意地方调用远程接口了
MemberController
@Autowired
private CouponFeignService couponFeignService;
@RequestMapping("/getCoupons")
public R getCoupons(){
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("张三");
R list = couponFeignService.list();
return R.ok().put("member",memberEntity).put("coupon",list.get("coupon"));
}
6、重启member和coupon服务
访问接口
成功
7、如果coupon服务掉线
首先注册中心显示实例不健康
然后再次访问刚才的远程调用接口
3、配置中心
1、在common服务中引入配置中心
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2、在服务中新建bootstrap.properties
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=localhost:8848
3、测试类在本地文件中读取
application.properties
coupon.user.name=ljs
coupon.user.age=30
CouponController
@Value("${coupon.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);
}
4、这样的方式需要修改代码,不方便。可以实现nacos动态加载配置
点击发布
需要每次重启项目,才能读取最新配置比较麻烦。在需要的类上加@RefreshScope
就可以实现动态刷新了
##当配置中心和当前应用配置文件配置了相同项。会优先读取配置中心
3.2、命名空间
命名空间可以用做环境隔离。对test,prod或dev环境进行隔离
新建命名空间
比如要上线则需要:在prod里添加配置
然后在配置里加上
bootstrap.properties
spring.cloud.nacos.config.namespace=f1ee59eb-4435-4e88-be78-67fad523122e
##重启项目访问,然后读取的就是prod的值,平时不指定命名空间,默认走public
命名空间也可以每一个微服务之间相互隔离,每一个微服务创建自己的一个命名空间。只加载自己命名空间下的所有配置
3.3、配置集
配置集:所有配置的集合
3.4、配置集id
也是Data id
类似文件名
3.5、配置分组
配置文件中,可以指定读取1111这个配置文件
bootstrap.properties
spring.cloud.nacos.config.namespace=b65fc030-7e5e-4d43-96ce-da9e12bbfe7c
spring.cloud.nacos.config.group=1111
##综合起来。我们每个微服务创建自己的命名空间,再使用配置分组区分环境
每次只需改配置分组即可
spring.cloud.nacos.config.group=dev
spring.cloud.nacos.config.group=prod
3.6、nacos加载多个配置集
分为3部分:dataSource.yml mybatis.yml other.yml
bootstrap.properties
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true
application.yml注释
#spring:
#datasource:
#username: root
#password: ljs
#url: jdbc:mysql://175.178.76.109:3309/gulimall_sms?useUnicode=true&characterEncoding=utf-8
#driver-class-name: com.mysql.jdbc.Driver
#cloud:
#nacos:
#discovery:
#server-addr: 127.0.0.1:8848
#mybatis-plus:
#mapper-locations: classpath:/mapper/**/*.xml
#global-config:
#db-config:
#id-type: auto
#server:
#port: 7000
启动无报错,访问成功
测试数据库连接无报错
4、网关(gateway)
网关是所有请求的入口,常见功能:路由转发、限流、权限校验等
gateway作为springcloud第二代网关,是代替了zuul网关
#客户端请求到达网关,网关通过断言来判定此次请求是否符合路由规则。如何符合,就将这些请求指定到指定地方。在指定过程中需要一系列过滤
创建一个module,网关项目
<dependency>
<groupId>com.ljs.gulimall</groupId>
<artifactId>gulimall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
GulimallGatewayApplication
@EnableDiscoveryClient
application.properties
# 应用名称
spring.application.name=gulimall-gateway
spring.cloud.nacos.discovery.server-addr=localhost:8848
bootstrap.properties
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=localhost:8848
4.2、创建名称空间
bootstrap.properties
spring.cloud.nacos.config.namespace=61000358-7806-44a3-a5df-ededef9ca7da
##直接启动会报错
由于网关引入common工程,且common工程引入了mybatis。网关不需要引入则排除
启动类
package com.ljs.gulimall.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableDiscoveryClient
public class GulimallGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallGatewayApplication.class, args);
}
}
可以正常启动了
4.3、配置网关
新建application.yml文件
spring:
cloud:
gateway:
routes:
- id: baidu_route
uri: https://www.csdn.net
predicates:
- Query=url,csdn
- id: qq_route
uri: https://www.qq.com
predicates:
- Query=url,qq
访问
http://localhost:88/aa?url=qq
访问
http://localhost:88/aa?url=csdn