大型商城: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})

 

 

阅读剩余
THE END