大型商城:SpringCloudAlibaba准备
springcloud笔记:https://www.tinstu.com/category/notes/springcloud
- 注册中心:nacos
- 配置中心:nacos
- 网关:gateway
- 远程调用:netflix把feign闭源了,spring cloud开了个openFeign
引入springcloudalibaba
引入以来,因为每个模块都需要,所有引入到 : gulimall-
<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>
上面是dependencyManagement依赖管理,相当于以后在dependencies里引spring cloud alibaba就不用写版本号。注意他和普通依赖的区别,他只是备注一下,并没有加入依赖
Nacos作为注册中心
nacos笔记1: https://www.tinstu.com/2350.html
nacos笔记2:https://www.tinstu.com/2360.html
1.下载nacos并启动
2.使用nacos
- 模块配置文件中指定nacos地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
再指定applicatin.name告诉注册到nacos中以什么命名spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 application: name: gulimall-coupon
- 依赖:放到common里,不写版本是因为父项目或spring-cloud里面有了版本管理
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
- 只启动类中加入
@EnableDiscoveryClient
注解开启服务注册与发现功能
3.测试nacos
Feign(远程调用)与注册中心
声明式远程调用
feign是一个声明式的HTTP客户端,他的目的就是让远程调用更加简单。给远程服务发的是HTTP请求。
会员服务想要远程调用优惠券服务,只需要给会员服务里引入openfeign依赖,他就有了远程调用其他服务的能力。
测试:
1.引入依赖
之前引入过
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.给coupon新增一个方法
@RequestMapping("/member/list")
public R membercoupons(){ //全系统的所有返回都返回R
// 应该去数据库查用户对于的优惠券,但这个我们简化了,不去数据库查了,构造了一个优惠券给他返回
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满100-10");//优惠券的名字
return R.ok().put("coupons",Arrays.asList(couponEntity));
}
3.在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="com.atguigu.gulimall.member.feign")//扫描接口方法注解
@EnableDiscoveryClient// 注册到nacos
@SpringBootApplication
public class gulimallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(gulimallMemberApplication.class, args);
}
}
4.在member的com.tinstu.gulimall.member.feign包下新建接口:
@FeignClient("gulimall-coupon") //告诉spring cloud这个接口是一个远程客户端,要调用coupon服务(nacos中找到)
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list")//注意写全优惠券类上还有映射//注意我们这个地方不是控制层,所以这个请求映射请求的不是我们服务器上的东西,而是nacos注册中心的
public R membercoupons();//得到一个R对象
}
5.然后我们在member的控制层写一个测试方法
/**
* 测试feign
*/
@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"));
}
6.测试
启动 gulimall-member 和 gulimall-coupon
确保两个负载在nacos中可以查到
访问:http://localhost:8000/member/member/coupons
nacos作为配置中心
nacos笔记1: https://www.tinstu.com/2350.html
nacos笔记2:https://www.tinstu.com/2360.html
意思是不在application.properties等文件中配置了,而是放到nacos配置中心公用,这样无需每台机器都改。
使用:
1.gulimall-common中添加依赖 nacos配置中心
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.在项目中创建配置文件:bootstrap.properties,此配置文件优先级比application.properties高
3.浏览器去nacos里的配置列表,点击+号,data ID:gulimall-coupon.properties(应用名.properties)
,创建yaml并发布
4.在需要用配置文件中内容的类上面加入注解:@RefreshScope
重启后(让注解生效),在nacos浏览器里修改配置,修改就可以观察到能动态修改了
nacos的配置内容优先于项目本地的配置内容。.
配置中心进阶
在nacos浏览器中还可以配置:
- 命名空间:用作配置隔离。(一般每个微服务一个命名空间)
- 默认public。默认新增的配置都在public空间下
- 开发、测试、开发可以用命名空间分割。properties每个空间有一份。也可以为每个微服务配置一个命名空间,微服务互相隔离
- 在bootstrap.properties里配置(测试完去掉,学习不需要)
# 可以选择对应的命名空间 # 写上对应环境的命名空间ID
spring.cloud.nacos.config.namespace=b176a68a-6800-4648-833b-be10be8bab00
- 配置集:一组相关或不相关配置项的集合。
- 配置集ID:类似于配置文件名,即Data ID
- 配置分组:默认所有的配置集都属于
DEFAULT_GROUP
。双十一,618的优惠策略改分组即可
# 更改配置分组
spring.cloud.nacos.config.group=DEFAULT_GROUP
网关gateway-88
GateWay笔记:https://www.tinstu.com/2275.html
网关的作用:
- 动态上下线:发送请求需要知道商品服务的地址,如果商品服务器有123服务器,1号掉线后,还得改,所以需要网关动态地管理,他能从注册中心中实时地感知某个服务上线还是下线。【先通过网关,网关路由到服务提供者】
- 拦截:请求也要加上询问权限,看用户有没有权限访问这个请求,也需要网关。
三大核心概念:
- Route: 发一个请求给网关,网关要将请求路由到指定的服务。路由有id,目的地uri,断言的集合,匹配了断言就能到达指定位置,
- Predicate断言: 就是java里的断言函数,匹配请求里的任何信息,包括请求头等。根据请求头路由哪个服务
- Filter: 过滤器请求和响应都可以被修改。
断言例子
spring:
cloud:
gateway:
routes:
- id: after_route
uri: https://example.org
predicates:
- name: Cookie
args:
name: mycookie
regexp: mycookievalue
-
代表数组,可以设置Cookie等多个内容。只有断言成功了,才路由到指定的地址。
新建一个网关
1.可以使用使用initilizer创建一个微服务,选中gateway
2.pom中修改springboot和springcloud的版本
3.主启动上加注解:@EnableDiscoveryClient
,加上gulimall-common依赖
4.通过配置文件application.yml将其注册到nacos,取名gulimall-gateway,端口88
//properties形式
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88
5.bootstrap.properties 填写nacos配置中心地址,指定命名空间(nacos中建好gateway的名称空间)
//properties形式
spring.application.name=gulimall-gateway
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=7f16faa0-c61c-4dbb-918b-4e18bcd22339
6.测试 application.yaml中以下内容
spring:
cloud:
gateway:
routes:
- id: test_route
uri: https://www.baidu.com
predicates:
- Query=url,baidu
访问:http://localhost:88/?url=baidu 跳转百度
更多看笔记!!!
ps:启动失败是因为数据库原因,可以先排除,在主启动类上加上
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})