开头老规矩,手动推荐一波了,欢迎大家关注我的公众号“风云编程录”,感谢大家🙏。
上一篇我们已经初步构建了五个组件,今天这一篇我们将向微服务跨出重要一步,引入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作为配置中心的一些详细配置。