学习:使用 SpringCloud 配置 nacos,feign,gateway

选择 Spring Cloud Alibaba 版本(以 2.1.0.RELEASE 为例)

<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>

nacos

nacos 作为注册中心

  1. 下载 nacos 并引入注册中心

    <!-- 引入 nacos 注册中心-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
  2. 配置文件中配置 Nacos Server 地址

    # application.properties 版本
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    # 配置注册中心的注册名
    spring.application.name=service-provider
    # 配置微服务端口号
    server.port=7000
    
    # application.yml 版本
    spring:
      # 数据源配置(详见 MyBatis-Plus 配置)
      datasource:
        driverClassName: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.23.133:3306/my_mall_sms
        username: root
        password: root
      # 注册中心地址
      cloud:
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848
      # 配置注册中心的注册名
      application:
        name: my-coupon
        
    # 配置微服务端口号
    server:
      port: 7000
    
  3. 使用 @EnableDiscoveryClient 注解开启服务注册与发现功能

    @EnableDiscoveryClient	// Nacos 注册
    @MapperScan("com.ran.mall.coupon.dao")
    @SpringBootApplication
    public class MyCouponApplication {
        public static void main(String[] args) {
            SpringApplication.run(MyCouponApplication.class, args);
        }
    }
    
  4. 运行微服务模块,访问 nacos 网址,检测是否注册成功

http://localhost:8848/nacos/

user:     nacos
passwoed: nacos

nacos 作为配置中心

  1. 修改 pom.xml 文件,引入 Nacos Config Starter
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 在 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据
# 模块名
spring.application.name=my-coupon
# nacos 地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
  1. 需要给 nacos配置中心 默认添加一个叫 数据集(Data id)默认规则:应用名.properties

  2. 在 nacos配置中心 中的配置文件添加任何配置

coupon.user.name=Ran
coupon.user.age=20
  1. 动态获取配置
@RefreshScope   // 动态获取配置
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {

    @Value("${coupon.user.name}")   // 获取某个配置的值
    private String name;
    @Value("${coupon.user.age}")    // 获取某个配置的值
    private Integer age;

    /**
     * 测试远程调用
     */
    public R test() {
        return R.ok().put("name", name).put("age", age);
    }
}
  1. 如果 本机配置中心 和 nacos配置中心 都有相同的配置项,优先选择 本机的配置

nacos 高级

  1. 命名空间:配置隔离

1)默认:public(保留空间);默认新增的所有配置都在 public 空间里

2)开发,测试,生产:利用命名空间来做环境隔离

3)每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置

# bootstrap.properties

# 模块名
spring.application.name=my-coupon
# nacos 地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 命名空间
spring.cloud.nacos.config.namespace=whatever
  1. 配置集:所有配置的集合

  2. 配置集ID:类似文件名

Data ID:类似文件名

  1. 配置分组

默认所有的配置集都属于:DEFAULT_GROUP 或是 自己定义的任意集

# bootstrap.properties

# 模块名
spring.application.name=my-coupon
# nacos 地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 命名空间
spring.cloud.nacos.config.namespace=whatever
# 设置分组
spring.cloud.nacos.config.group=dev
  1. 同时加载多个配置文件
# bootstrap.properties

# 模块名
spring.application.name=my-coupon
# nacos 地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 命名空间
spring.cloud.nacos.config.namespace=whatever
# 设置分组
# spring.cloud.nacos.config.group=dev

spring.cloud.nacos.config.exit-config[0].data-id=datasource.yml 
spring.cloud.nacos.config.exit-config[0].group=dev
spring.cloud.nacos.config.exit-config[0].refresh=true

spring.cloud.nacos.config.exit-config[1].data-id=mybatis.yml 
spring.cloud.nacos.config.exit-config[1].group=dev
spring.cloud.nacos.config.exit-config[1].refresh=true

spring.cloud.nacos.config.exit-config[2].data-id=other.yml 
spring.cloud.nacos.config.exit-config[2].group=dev
spring.cloud.nacos.config.exit-config[2].refresh=true

远程调用

实际上远程调用就是使用不同的模块在 nocos 注册中心中寻找不同模块中的不同方法,使用 OpenFeign 等技术进行调用,以实现在 A模块 中使用 B模块 中的方法。此时,若 B模块 掉线则 A模块 将报错。

Open-Feign

  1. 引入open-feign 依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  1. 编写一个接口,告诉 SpringCloud 这个接口需要调用远程服务
// 例如:我们需要在member模块中调用coupon模块中这个memberCoupon()方法
@RestController
@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模块中声明一个接口,告诉每一个方法都是调用哪个远程服务的哪个请求

/**
 * 这是一个声明式远程调用接口
 * 告诉 SpringCloud 需要调用哪些模块的内容
 */
@FeignClient("my-coupon")
public interface CouponFeignService {
	
    @RequestMapping("/coupon/coupon/member/list")	// 这里需要写出调用的方法的全路径
    R memberCoupons();								// 这里需要写出这个方法的方法名
}
  1. 开启远程调用功能
@EnableDiscoveryClient    // Nacos 注册
@EnableFeignClients(basePackages = "com.ran.mall.member.feign") // 开启远程调用功能
@MapperScan("com.ran.mall.member.dao")
@SpringBootApplication
public class MyMemberApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyMemberApplication.class, args);
    }
}
  1. 测试远程调用
@RestController
@RequestMapping("member/member")
public class MemberController {
    /**
     * 测试远程调用
     */
    @Autowired
    private CouponFeignService couponFeignService;

    /**
     * 测试远程调用
     */
    @RequestMapping("/coupons")
    public R test() {
        MemberEntity memberEntity = new MemberEntity();
        memberEntity.setNickname("ran");
		// 远程调用 coupon 模块中的方法
        R coupons = couponFeignService.memberCoupons();

        return R.ok().put("member", memberEntity).put("coupons", coupons.get("coupons"));
    }
}

Gateway 网关

配置网关

  1. 项目中新建 gateway 微服务项目,引入 Spring Cloud Gateway

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ecAOIBG-1657257799924)(E:\简历与面试\Java面经\img\1656341652655.png)]

  1. 配置 nacos 注册中心
# 应用名称
spring.application.name=my-gateway

# 注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

# 配置启动端口
server.port=88
// 开启服务注册发现
@EnableDiscoveryClient
// 排除跟数据库有关的配置
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyGatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyGatewayApplication.class, args);
    }
}
  1. 设置 nacos配置中心

1)在 nacos 中设置 gateway 命名空间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LpMBDXFD-1657257799934)(E:\简历与面试\Java面经\img\1656341891547.png)]

2)在项目中配置

# bootstrap.properties
# 模块名
spring.application.name=my-gateway

# nacos 地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

# 命名空间(这个就是上图中gateway的唯一id)
spring.cloud.nacos.config.namespace=43d539a6-c9fc-4f2d-b48b-7d30b76fe32e
  1. 配置 gateway 的跳转规则
# application.yml
spring:
  cloud:
    gateway:
      routes:
        # 路由到百度
        - id: baidu_route
          uri: https://www.baidu.com  # 前往的网址
          predicates:                 # 匹配规则
            - Query=url,baidu         # 当请求中含url,且url后的内容为baidu,则前往百度官网
        # 路由到QQ
        - id: qq_route
          uri: https://www.qq.com
          predicates:
            - Query=url,qq
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值