商城项目--6.Nacos中间件的加入

开头老规矩,手动推荐一波了,欢迎大家关注我的公众号“风云编程录”,感谢大家🙏

上一篇我们已经初步构建了五个组件,今天这一篇我们将向微服务跨出重要一步,引入nacos作为我们项目的注册中心以及配置中心。这也是微服务项目中很重要的中间件。

今天这一篇文章,我们又往前跨了四步:

(1)安装部署nacos服务器

(2)配置nacos作为项目的注册中心

(3)使用openFeign实现跨服务的远程调用

(4)配置nacos作为项目的配置中心(基本案例)

1. 安装部署nacos服务器

下载nacos server,然后在本地启动,我们此处使用的是nacos 1.3.1版本,具体下载地址:

Release 1.3.1(July 10, 2020) · alibaba/nacos · GitHub

1)执行bin目录下的 startup.sh 命令

2022-12-09 17:04:42,475 INFO The server IP list of Nacos is []

2022-12-09 17:04:43,487 INFO Nacos is starting...

2022-12-09 17:04:44,489 INFO Nacos is starting...

2022-12-09 17:04:45,493 INFO Nacos is starting...

2022-12-09 17:04:46,497 INFO Nacos is starting...

2022-12-09 17:04:47,500 INFO Nacos is starting...

java.io.IOException: java.lang.IllegalArgumentException: db.num is null

2)启动问题

java.io.IOException: java.lang.IllegalArgumentException: db.num is null   

可以看到启动日志中有报错,nacos服务器启动失败,通过网上搜索,我采用了最简单的一种修改方式,采用了nacos的单机模式,具体修改如下:

将nacos的bin目录下的startup.sh修改

export MODE=“cluster”

修改为

export MODE="standalone"

保存startup.sh后重新启动该脚本,启动成功

3)  访问测试

localhost:8848/nacos

 使用用户名和密码 nacos nacos登陆成功

2.  配置nacos作为项目的注册中心

0)配置nacos的依赖管理 

为方便后续使用springcloud全家桶的时候,不用我们自己去管理版本,我们使用了maven中的依赖管理,在我们的公共组件gulimall-common组件中添加如下依赖管理。

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

在common组件的pom.xml中使用依赖管理,后续在正式的dependency中引用相关依赖的时候就可以不用标记版本号了。

1) Nacos注册中心配置

由于我们已经在common组件中添加了依赖管理,那么我们将nacos的注册中心的依赖也加入到common组件中,方便其他组件直接使用

<dependency>

    <groupId>com.alibaba.cloud</groupId>

    <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>

</dependency>

在需要注册的组件的application.yml配置文件中添加如下配置:

spring:

  cloud:

    nacos:

      discovery:

        server-addr: 127.0.0.1:8848

  application:

    name: gulimall-coupon

2)添加使能注解

@SpringBootApplication
@EnableDiscoveryClient
public class GulimallCouponApplication {

    public static void main(String[] args) {

        SpringApplication.run(GulimallCouponApplication.class, args);

    }

}

3) 验证Nacos服务注册

启动nacos以及coupon服务

 服务列表中可以看到coupon服务已经起来了,并在nacos上完成了注册。同样的道理将其他组件也注册到nacos上, 如下:

3. 使用openFeign实现跨服务的远程调用

eg. 测试member组件通过SpringCloud-openFeign 远程调用coupon组件中的方法

1)在coupon组件中创建被调用的方法

@RestController

@RequestMapping("coupon/coupon")

public class CouponController {


    ...

    @RequestMapping("/member/list")

    public R membercoupons(){

        CouponEntity couponEntity = new CouponEntity();

        couponEntity.setCouponName("满100减10");

        return R.ok().put("coupons", Arrays.asList(couponEntity));

    }
    ...
}

2)  member组件中进行操作

A. 引入openfeign依赖

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

B. 编写一个接口,告诉springcloud这个接口需要调用远程服务

在member组件中创建一个feign访问接口,然后将coupon组件中对应接口的声明放过来,具体实现如下:

@FeignClient("gulimall-coupon")

public interface CouponFeignService {

    @RequestMapping("/coupon/coupon/member/list")

    public R membercoupons();

}

C. 在member组件的入口方法处开启远程访问

@SpringBootApplication

@EnableDiscoveryClient

@EnableFeignClients(basePackages = "com.whq.gulimall.member.feign”)   //feigin接口所处目录

public class GulimallMemberApplication {



    public static void main(String[] args) {

        SpringApplication.run(GulimallMemberApplication.class, args);

    }
    


}

编写完成后,启动member以及coupon组件,测试该远程调用。

3) 启动问题

集成feign报错:No Feign Client for loadBalancing defined. Did you forget to include

原因是:

SpringCloud Feign在Hoxton.M2 RELEASED版本之后不再使用ribbon

而是使用spring-cloud-loadbalancer,所以在不引入spring-cloud-loadbalancer情况下会报错

解决方法:

加入spring-cloud-loadbalancer依赖 并且在nacos中排除ribbon依赖,不然loadbalancer无效

代码如下(common组件pom.xml中配置,方便其他组件可以直接使用):

       <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.netflix.ribbon</groupId>
                    <artifactId>ribbon</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>

修改完成后,测试成功

4. 配置nacos作为项目的配置中心(基本案例)

4.1 不用nacos的传统参数配置

1)common组件添加配置中心的依赖

<dependency>

    <groupId>com.alibaba.cloud</groupId>

    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>

</dependency>

2) bootstrap.properties配置

这个配置文件是springboot中要求,优先级是高于application.properties,在bootstrap.properties 中的配置是优先读取的。

spring.application.name=gulimall-coupon

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

3) 新增应用配置

为了验证配置中心的作用,我们在coupon组件的application.properties文件中新增了两个配置

user.name=zhangsan

user.age=18

4) 代码注解

//使用了一个Value注解,可以直接获取配置文件中的配置

@Value("${user.name}")

private String name;

@Value("${user.age}")

private Integer age;



@RequestMapping("/test")

public R test(){

    return R.ok().put("name", name).put("age", age);

}

然后我们进行测试

 我们可以看到name的名字是GodShadow,age是对的,是因为user.name这个是个系统变量,直接取的是当前系统的该变量的值,为了进行区分,我们将application.properties中的参数进行修改

修改配置以及代码如下:

@Value("${coupon.user.name}")

private String name;

@Value("${coupon.user.age}")

private Integer age;
coupon.user.name=zhangsan

coupon.user.age=18

测试完成:

4.2 使用nacos进行配置管理

为了方便进行修改,我们将我们的配置移交给配置中心nacos进行管理。默认nacos会读取配置文件中的配置,默认的配置文件是  应用名.properties, coupon组件是gulimall-coupon.properties

在nacos中新增配置如下:

 配置成功后,我们修改nacos中的配置将age修改为20。 可以看到,前面页面显示的仍然是18,并没有实现动态发布的功能。

此处需要我们新增一个新的注解配置

@RefreshScope

@RestController

@RequestMapping("coupon/coupon")

public class CouponController 

这样就实现了动态刷新配置

问题

反正我配置完成后,动态刷新没有生效,而且视频中讲到的,有存在从哪个文件读取配置的日志也没有打印。

原来是我配置的bootstrap.properties配置文件没有生效。

解决方法:

需要在common组件中添加这个依赖

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-bootstrap</artifactId>

    <version>3.0.4</version>

</dependency>

这个时候即使删除掉application.properties文件中的配置也是可以的,应用启动后,确实打印了加载日志:

c.a.c.n.c.NacosPropertySourceBuilder     : Loading nacos data, dataId: 'gulimall-coupon.properties', group: 'DEFAULT_GROUP'

5. 总结一下使用nacos作为配置中心的操作步骤

(1)引入依赖

<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=127.0.0.1:8848

(3)需要给配置中心默认添加一个配置文件 :数据集(data id),默认规则 应用名.properties,然后在其中添加所需要的配置

(4)配置自动生效,需要添加注解

@Value(“${}”)

@RefreshScope

(5)自动刷新配置

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-bootstrap</artifactId>

    <version>3.0.4</version>

</dependency>

如果application.properties中存在配置,他的优先级是低于nacos配置中心的配置。

至此,nacos作为中间件已经加入到我们的项目中了,下一篇我们会详细介绍一下关于nacos作为配置中心的一些详细配置。

最后还是老规矩,推荐一波:欢迎大家关注我的公众号“风云编程录”,感谢大家🙏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值