文章目录
系列文章:
Nacos-01-Nacos的简介和安装
代码地址: https://gitee.com/cangyu1024/nacos-demo
1:配置中心
1:基本配置使用
nacos配置如下,使用dev的命名空间
0:导包
<!-- 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
1:配置
在bootstrap.yml中配置,他比application.yml加载的早
server:
port: 18080
servlet:
context-path: /
spring:
application:
name: nacos_config_test
cloud:
nacos:
config:
server-addr: ip:8848
namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9
group: DEFAULT_GROUP
name: nacos-test.yml
file-extension: yml
2:使用
package com.java1234.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/*
* @description:
* @author: wangkanglu
* @date: 2022/8/25 21:09
* @param:
* @return:
**/
@RestController
@RequestMapping("/nacos")
@RefreshScope
public class NacosConfigController {
@Value("${java.name}")
private String name;
@Value("${java.age}")
private String age;
@GetMapping("/getConfigInfo")
public String getConfigInfo(){
return name+":"+age;
}
}
2:加载多配置集
1:配置
在bootstrap.yml中配置,他比application.yml加载的早
server:
port: 18080
servlet:
context-path: /
spring:
application:
name: nacos_config_test
cloud:
nacos:
config:
server-addr: ip:8848
namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9
group: DEFAULT_GROUP
file-extension: yml
extension-configs:
- data-id: nacos-test.yml
group: DEFAULT_GROUP
refresh: true
- data-id: nacos-pro.yml
group: DEFAULT_GROUP
refresh: true
注:
- data-id : Data Id
- group:自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
- refresh: 控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。
2:使用
package com.java1234.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/*
* @description:
* @author: wangkanglu
* @date: 2022/8/25 21:09
* @param:
* @return:
**/
@RestController
@RequestMapping("/nacos")
@RefreshScope
public class NacosConfigController {
@Value("${java.name}")
private String name;
@Value("${java.age}")
private String age;
//这个是从nacos-pro.yml中获取的
@Value("${java.sex}")
private String sex;
@GetMapping("/getConfigInfo")
public String getConfigInfo(){
return name+":"+age+":"+sex;
}
}
2:服务发现
1:服务注册与发现介绍
大的分布式微服务项目会根据业务,把项目拆分成多个业务模块项目,然后互相调用;
如何互相调用呢?
这里我们每个项目模块都需要去nacos服务注册中心注册下,登记下每个项目自身的地址和端口,然后其他的项目模块就可以通过Nacos找到需要调用的其他模块项目的地址了;
这样就可以实现服务的发现和调用;
2:服务注册
1:导包
<!-- 服务注册/发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2:配置
在bootstrap.yml中配置
server:
port: 18081
servlet:
context-path: /
spring:
application:
name: nacos_provider
cloud:
nacos:
discovery:
#注册中心地址
server-addr: ip:8848
#注册中心命名空间
namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9
config:
#配置中心地址
server-addr: 42.193.114.46:8848
#配置中心命名空间
namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9
#配置中心分组
group: DEFAULT_GROUP
file-extension: yml
extension-configs:
- data-id: nacos-test.yml
group: DEFAULT_GROUP
refresh: true
- data-id: nacos-pro.yml
group: DEFAULT_GROUP
refresh: true
3:测试
3:服务调用
1:导包
<!-- openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2:配置
1:配置bootstrap.yml
server:
port: 18082
servlet:
context-path: /
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
#注册中心地址
server-addr: ip:8848
#注册中心命名空间
namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9
config:
#配置中心地址
server-addr: ip:8848
#配置中心命名空间
namespace: 55f18581-f53b-4d17-b27a-d05d182fe1a9
#配置中心分组
group: DEFAULT_GROUP
file-extension: yml
extension-configs:
- data-id: nacos-test.yml
group: DEFAULT_GROUP
refresh: true
- data-id: nacos-pro.yml
group: DEFAULT_GROUP
refresh: true
2:定义Feign接口,生成动态代理对象
package com.example.nacos_consumer.feign.provider;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author wangkanglu
* @version 1.0
* @description
* @date 2022-08-25 22:11
*/
//@FeignClient(contextId = "remoteSearchService", value = ServiceNameConstants.SEARCH_CLIENT, fallbackFactory = RemoteSearchFallbackFactory.class)
@FeignClient(name = "nacos-provider")//这个注解就是指向被调用的服务
@Component
public interface RemoteHelloService {
@RequestMapping("/provider/hello")//这个地址就是被调用服务的地址
public String hello();
}
3:启动类加@EnableFeignClients(basePackages = “com.java1234.feign”)
开启Feign客户端支持
package com.example.nacos_consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
}
注:@FeignClient注解说明
value、name
value和name的作用一样,如果没有配置url那么配置的值将作为服务名称,用于服务发现。反之只是一个名称。
contextId
我们不想将所有的调用接口都定义在一个类中,有一种解决方案就是为每个Client手动指定不同的contextId,这样就不会冲突了。
url
url用于配置指定服务的地址,相当于直接请求这个服务,不经过Ribbon的服务选择。像调试等场景可以使用。
decode404
当调用请求发生404错误时,decode404的值为true,那么会执行decoder解码,否则抛出异常。
configuration
configuration是配置Feign配置类,在配置类中可以自定义Feign的Encoder、Decoder、LogLevel、Contract等。
fallback
定义容错的处理类,也就是回退逻辑,fallback的类必须实现Feign Client的接口,无法知道熔断的异常信息。
fallbackFactory
也是容错的处理,可以知道熔断的异常信息。
path
path定义当前FeignClient访问接口时的统一前缀,比如接口地址是/user/get, 如果你定义了前缀是user, 那么具体方法上的路径就只需要写/get 即可。
primary
primary对应的是@Primary注解,默认为true,官方这样设置也是有原因的。当我们的Feign实现了fallback后,也就意味着Feign Client有多个相同的Bean在Spring容器中,当我们在使用@Autowired进行注入的时候,不知道注入哪个,所以我们需要设置一个优先级高的,@Primary注解就是干这件事情的。
qualifier
qualifier对应的是@Qualifier注解,使用场景跟上面的primary关系很淡,一般场景直接@Autowired直接注入就可以了。
3:负载均衡
1:负载一个完全一样的provider,只要spring.application.name是一样的,即视为同一个服务
2:启动两个provider和consumer
3:查看nacos
4:也可以进去对各实例的权重,是否上线做出判断