电商项目3、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
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值