一、配置中心

1. Nacos配置中心的三大抽象概念

命名空间Namespace:代表不同环境,如开发、测试、生产环境,命名空间ID可以唯一标识这个命名空间
配置分组Group:代表某项目,如XX医疗项目、XX电商项目
配置集DataID:每个项目下往往有多个工程,每个配置集(DataID)是一个工程(微服务)的主配置文件,每个配置集DataID中包含的一个个配置内容就是配置项,比如连接数据库的参数配置、日志项配置等

nacos namespace 指定后取public nacos namespace group_服务发现

注意事项:

  1. 在编写程序获取配置集时,如果没有指定命名空间,那么会默认指向保留的命名空间public
  2. 不同命名空间是互相隔离的,创建相同Group、相同DataID也互不影响

2. 应用端程序获取指定命名空间下的配置信息

String serverAddr = "127.0.0.1:8848"; //IP+端口
String namespace = "d8fuhs-8dfdfjd-8udd-8df99";
String group = "DEFAULT_GROUP";
String dataId = "nacos-simple-demo.yml";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
properties.put("namespace", namespace);
ConfigService configService = NacosFactory.createConfigService(properties);
//获取配置并输出控制台
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);

3. 配置管理

(1) 批量处理配置文件:

① 导入导出:将dev命名空间下的配置文件导出到文件夹,然后将其导入到pro命名空间

② 克隆:将dev命名空间下的配置文件克隆到pro命名空间

(2) 对历史版本进行回滚
(3) 监听查询:应用端添加监听器
configService.addListener(dataId, group, new Listener() {
	public Executor getExecutor() {
		return null;
	}
	//当配置文件有变化时,获取通知
	public void receiveConfigInfo(String s) {
		System.out.println(s);
	}
});

4. Nacos配置管理应用于分布式系统

(1) 从单体架构到微服务架构

单体架构

微服务架构

特点

虽是模块化逻辑,但最终会打包部署为单体式应用,所有功能都会部署在一个web容器中运行

将原先巨大的单体式应用分解为各个完成特定功能的微服务,每一个微服务都是完整应用,都有自己的业务逻辑和数据库

优点

开发效率高,模块之间交互采用本地方法调用,节省了微服务之间的交互和开发成本

易于开发、理解和维护,方便团队的拆分和管理,分而治之,职责单一

容易测试,在本地就可以启动完整的系统

局部容易修改,容易替换,容易部署,有利于持续集成和快速迭代

容易部署,运维成本小,直接打包成一个完整的包,拷贝到web容器中某个目录即可运行

能够单独的对指定的服务进行伸缩,不受限于任何技术栈

缺点

复杂性和可维护性逐渐变高,所有业务模块部署在一起,牵一发而动全身

版本迭代速度变慢,修改一个地方需要将整个应用全部编译、部署、启动时间过长

不方便进行功能伸缩

(2) 分布式应用配置管理结构

nacos namespace 指定后取public nacos namespace group_服务发现_02

(3) 分布式应用配置管理

① 在Nacos服务发现中心发布配置

nacos namespace 指定后取public nacos namespace group_ide_03


② 创建父工程

③ 微服务service1配置:bootstrap.yml

由于使用外部配置中心,需创建bootstrap.yml,并且bootstrap.yml的加载顺序是优先于application.yml的,bootstrap.yml中的内容如下所示:

nacos namespace 指定后取public nacos namespace group_ide_04


④ 微服务service2配置(和service1类似)

⑤ 支持配置的动态更新

//注入配置文件上下文
@Autowired
private ConfigurableAapplicationContext applicationContext;

@GetMapping(value = "/configs")
public String getConfigs() {
	return applicationContext.getEnvironment().getProperty("common.name");
}

⑥ 自定义扩展的DataId配置(可以让多个微服务读取一些公共的DataId配置集)

nacos namespace 指定后取public nacos namespace group_服务发现_05


⑦ 配置的优先级

nacos namespace 指定后取public nacos namespace group_微服务_06


⑧ 完全关闭配置

cloud:
	nacos:
		config:
			enabled: false #关闭配置

5. Nacos配置管理-集群部署

(1) 安装3个以上Nacos

可以复制之前解压好的nacos文件,分别命名为nacos1、nacos2、nacos3

(2) 配置集群配置文件

所有nacos目录的conf目录下,有文件cluster.conf.example,将其命名为cluster.conf,并将每行配置成ip:port(请配置3个以上)

# ip:port
127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850
(3) 分别执行nacos目录下的bin目录下的startup:
startup -m cluster
(4) 启动后效果如下:

nacos namespace 指定后取public nacos namespace group_java_07

(5) 客户端配置的方式
方式一:客户端配置多个Nacos服务中心(IP+端口号)

nacos namespace 指定后取public nacos namespace group_微服务_08

方式二(官方推荐方式):域名+虚拟IP的形式,该种方式下当Nacos集群迁移时,客户端配置无需修改

nacos namespace 指定后取public nacos namespace group_服务发现_09

二、服务发现

1. 服务发现的定义

在微服务架构中,各个服务之间会通过协作来实现业务目标,免不了要进行服务的远程调用,服务的消费方要调用服务的生产方,为了完成一次请求,消费方需要知道服务生产方的网络位置(IP地址和端口号)

2. SpringCloud服务协作流程

SpringCloud常见的集成方式是使用Feign+Ribbon技术来完成服务远程调用及负载均衡。

nacos namespace 指定后取public nacos namespace group_命名空间_10

整体流程如下
微服务将自己的地址注册到Nacos服务发现中心,发现中心会维护微服务的注册表,当服务消费方需要调用服务生产方时,就可以从服务发现中心获取到服务生产方的地址,来进行远程调用。

(1) 负载均衡

就是将用户请求通过一定的策略,分摊在多个服务实例上执行,能够处理高并发、缓解网络压力和实现服务端扩容,主要可以分为服务端负载均衡客户端负载均衡

Nginx - 服务端负载均衡
Ribbon - 客户端负载均衡

(2) 服务调用Feign

① 声明Feign客户端

@FeignClient(value = "serviceB")
public interface ServiceBAgent {
	@GetMapping(value = "/service")
	public String service();
}

② 业务调用

@Autowired
private ServiceBAgent serviceBAgent;
//...略
serviceBAgent.service();
//...略

3. Nacos服务发现入门案例

服务生产者

(1) 服务生产者的application

nacos namespace 指定后取public nacos namespace group_java_11

(2) Provider(生产者)服务实现
@RestController
public class ProviderController {
	@GetMapping("/service")
	public String service() {
		return "provider invoke";
	}
}
(3) 启动生产者
@SpringBootAapplication
@EnableDiscoveryClient
@EnableFeignClients
public class NacosProviderApp {
	public static void main(String[] args) {
		SpringApplication.run(NacosProviderApp.class, args);
	}
}

服务消费者

(1) 服务消费者的application

nacos namespace 指定后取public nacos namespace group_微服务_12

(2) 生产者的远程代理
@FeignClient(name = "quickstart-provider")
public interface ProviderClient {
	@GetMapping("/service")
	String service();
}
(3) 消费者服务实现
@RestController
public class ConsumerController {
	@Autowired
	private ProviderClient providerClient;
	@GetMapping("/service")
	public String service() {
		String providerResult = providerClient.service();
		return "consumer invoker" + "|" + providerResult; 
	} 
}
(4) 启动消费者
@SpringBootAapplication
@EnableDiscoveryClient
@EnableFeignClients
public class NacosConsumerApp {
	public static void main(String[] args) {
		SpringApplication.run(NacosConsumerApp.class, args);
	}
}

4. 测试多实例负载均衡

(1) application中设置动态参数

nacos namespace 指定后取public nacos namespace group_服务发现_13

(2) 启动配置中的VM options

nacos namespace 指定后取public nacos namespace group_ide_14

(3) 启动两个实例后,Nacos服务发现中心的信息

nacos namespace 指定后取public nacos namespace group_服务发现_15

nacos namespace 指定后取public nacos namespace group_ide_16

5. 指定命名空间和配置分组

之前的例子没有指定,默认是在public命名空间中的DEFAULT-GROUP分组中,下面给出如何自己指定位置

nacos namespace 指定后取public nacos namespace group_ide_17

6. Spring Cloud Alibaba 综合集成架构

nacos namespace 指定后取public nacos namespace group_微服务_18

7. 网关gateway-zuul

作用一:路由转发,手机这个客户端需要访问许多微服务,每一个服务的实例都有一个地址,客户端就需要记住很多地址,很不方便。但是有了网关之后,客户端只需要记住网关这一个地址,由网关把请求转发到各个微服务。

作用二:过滤,拦截不合法请求。

(1) bootstrap.yml

nacos namespace 指定后取public nacos namespace group_ide_19

(2) 在Nacos中的配置

nacos namespace 指定后取public nacos namespace group_java_20

(3) 网关服务启动类

nacos namespace 指定后取public nacos namespace group_命名空间_21