一、架构的演变(图参考自蚂蚁课堂)
1、单体应用架构
这种架构部署很简单,像SSM框架就是典型的例子,运维人员共各地不需要太深功力。但是这种架构很有问题,代码耦合度极高,只要一点需求变动,就要重新打包部署,整个系统期间都处于不可用状态,而且没有对业务逻辑代码进行拆分,代码都挤在一起。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZj91YpB3IwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSP9EUT4FEVOpXUU1kMVRVTx5kMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1IDN0AzN1cTM1ATNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
2、分布式架构
这种架构将业务进行了粗粒度的拆分,不同业务直接写在不同系统上面,一定程度上降低了代码的耦合度。
3、SOA架构模式(Service-Oriented Architecture)
面向与接口开发,将共同存在的业务逻辑抽取成一个共同的服务,提供给其他的服务接口实现调用、服务与服务之间通讯采用rpc远程调用技术。基于SOAP协议(HTTP+XML),数据冗余量非常大。
4、微服务架构
每个服务都可以单独运行,服务与服务通讯协议采用Http协议,使用restful风格API形式来进行通讯,数据交换格式轻量级json格式通讯,整个传输过程中,采用二进制,所以http协议可以跨语言平台,
二、服务发现
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.
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注册中心
三、分布式配置中心
重点(纯属个人见解):
首先,必须要搞清楚分布式配置中心要解决的问题—集群部署的时候可以动态修改配置,不需要重启服务器。微服务集群部署特点:都是注册到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}的看下图。
运行,报错,不用慌。
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;
}
}
4、测试
经测试后,加上@RefreshScope注解后已经可以动态刷新加载配置了。
学习链接资源:http://www.mayikt.com/front/couinfo/247/0