天天看点

SpringCloud---nacos(服务注册中心、分布式配置中心)

一、架构的演变(图参考自蚂蚁课堂)

1、单体应用架构

       这种架构部署很简单,像SSM框架就是典型的例子,运维人员共各地不需要太深功力。但是这种架构很有问题,代码耦合度极高,只要一点需求变动,就要重新打包部署,整个系统期间都处于不可用状态,而且没有对业务逻辑代码进行拆分,代码都挤在一起。

SpringCloud---nacos(服务注册中心、分布式配置中心)

2、分布式架构

       这种架构将业务进行了粗粒度的拆分,不同业务直接写在不同系统上面,一定程度上降低了代码的耦合度。

SpringCloud---nacos(服务注册中心、分布式配置中心)

3、SOA架构模式(Service-Oriented Architecture)

       面向与接口开发,将共同存在的业务逻辑抽取成一个共同的服务,提供给其他的服务接口实现调用、服务与服务之间通讯采用rpc远程调用技术。基于SOAP协议(HTTP+XML),数据冗余量非常大。

SpringCloud---nacos(服务注册中心、分布式配置中心)

4、微服务架构

       每个服务都可以单独运行,服务与服务通讯协议采用Http协议,使用restful风格API形式来进行通讯,数据交换格式轻量级json格式通讯,整个传输过程中,采用二进制,所以http协议可以跨语言平台,

SpringCloud---nacos(服务注册中心、分布式配置中心)

二、服务发现

1、父工程引入以下pom.xml(直接用了最新的版本)

<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR4</spring-cloud.version>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

 	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!--            <exclusions>-->
            <!--                <exclusion>-->
            <!--                    <groupId>com.fasterxml.core</groupId>-->
            <!--                    <artifactId>jackson-databind</artifactId>-->
            <!--                </exclusion>-->
            <!--            </exclusions>-->
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
<!--                <exclusions>-->
<!--                    <exclusion>-->
<!--                        <groupId>com.fasterxml.jackson.dataformat</groupId>-->
<!--                        <artifactId>jackson-dataformat-xml</artifactId>-->
<!--                    </exclusion>-->
<!--                </exclusions>-->
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
           
2、启动nacos

windows双击startup.cmd,Linux运行startup.sh。默认端口是8848.

SpringCloud---nacos(服务注册中心、分布式配置中心)

3、配置生产者和消费者的配置文件

生产者配置文件:

spring.application.name=member-service	#往nacos注册的服务名称
	spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848	#nacos可视化界面所在的端口
	
	server.port=8081	#该服务部署的端口
           

消费者配置文件:

spring.application.name=order-service	#往nacos注册的服务名称
	spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848	#nacos可视化界面所在的端口
	
	server.port=9090	#该服务部署的端口
           

4、测试nacos注册中心

SpringCloud---nacos(服务注册中心、分布式配置中心)

三、分布式配置中心

重点(纯属个人见解):

       首先,必须要搞清楚分布式配置中心要解决的问题—集群部署的时候可以动态修改配置,不需要重启服务器。微服务集群部署特点:都是注册到nacos上,服务名称一致,IP或者端口号不同,所以通过RPC远程调用的时候会有本地的负载均衡算法,算法本质还是从nacos注册中心根据提供的服务名称取到一个IP地址的集合。OK,有了这些基础,看下面代码应该so easy。

1、父工程继续添加依赖

<dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
     </dependency>
           

2、config服务添加配置

       分布式配置中心写在bootstrap文件中,而服务注册和发现写在SpringBoot常见的配置文件中。bootstrap.yml 用于应用程序上下文的引导阶段。application.yml 由父Spring ApplicationContext加载。而连接nacos分布式配置中心一定需要优先加载。

application.properties文件配置:
	spring.application.name=config-service	#看完之前说的重点, 应该明白了这个为什么要和bootstrap中服务名称一致了
	spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
	
	server.port=8888
	spring.main.allow-bean-definition-overriding=true
	
	
bootstrap.properties文件配置:	
	spring.cloud.nacos.config.server-addr=127.0.0.1:8848
	
	spring.application.name=config-service	#看完之前说的重点, 应该明白了这个为什么要和bootstrap中服务名称一致了
	spring.profiles.active=dev
	spring.cloud.nacos.config.file-extension=yaml	#严格区分yml和yaml, 配置中心配置的格式只能是yaml
	
	#${spring.application.name}-${spring.profile.active}.${file-extension}
           

不理解${spring.application.name}-${spring.profile.active}.${file-extension}的看下图。

SpringCloud---nacos(服务注册中心、分布式配置中心)

运行,报错,不用慌。

Description:
	
	The bean 'nacosConfigProperties', defined in class path resource [com/alibaba/cloud/nacos/NacosConfigBootstrapConfiguration.class], could not be registered. A bean with that name has already been defined in class path resource [org/springframework/cloud/alibaba/nacos/NacosConfigBootstrapConfiguration.class] and overriding is disabled.
	
	Action:
	
	Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
           

配置文件中添加:

加上后,发现没屌用。又仔细查看了pom.xml,终于找到了问题根源,父工程和子工程引入依赖版本不一致造成的。去掉子工程的老版本。

3、测试代码

@RestController
	@RefreshScope   //动态刷新nacos配置中心所配置的文件中的数据, 一定要加载本类上(不要加在启动类上)
	public class ConfigController {
	    @Value("${meeting.msg}")
	    private String message;
	
	    @GetMapping("/config")
	    public String getMessage() {
	        return message;
	    }
	}
           
SpringCloud---nacos(服务注册中心、分布式配置中心)

4、测试

经测试后,加上@RefreshScope注解后已经可以动态刷新加载配置了。

SpringCloud---nacos(服务注册中心、分布式配置中心)

学习链接资源:http://www.mayikt.com/front/couinfo/247/0

继续阅读