springcloudalibaba之注册和配置中心nacos

1.微服务背景

1.1传统项目的局限性

传统项目即单体应用,是把项目中所有模块和代码都整合在一个项目里,它虽然开发和运维比较简单,但随着业务和需求的发展,其局限性明显体现了。这些局限性体现在耦合度高,业务逻辑没有充分拆分,往往在某个模块崩溃了造成整个系统的崩溃。比如说我在老东家的quartz与web端整合在一个项目里,一旦quartz崩溃了就容易导致整个服务崩溃。还有多个服务耦合度高,在同一个项目里出现了测试困难,而且前后端不分离,造成可扩展性低,不能兼容其他语言调用。

1.2分布式微服务架构演变

为了解决单体应用的局限性,分布式系统就此诞生。分布式系统就是根据业务逻辑将系统进行拆分,降低了耦合度。然而,早期的分布式系统代码的冗余度还是很高,共同业务逻辑仍然没有统一抽取。
为解决最早的分布式系统的代码冗余,SOA(面向服务化)架构诞生了。它把共同业务逻辑抽取出来,建立一个公共服务。数据传输格式用的是xml。服务间用rpc调用。传输用SOAP协议。其缺点是开发效率低,高并发下存在冗余,服务治理和管理难,不适于前后端分离。为此微服务诞生了。

1.3微服务定义

微服务是原有的服务系统在SOA基础上进行粒度更细的拆分,服务通信传输使用restful,数据传输采用json格式,从而实现跨语言通信。更加有利于前后端分离,提升了服务的兼容性和可扩展性。

1.4微服务需要解决的问题

微服务需要解决的问题有分布式注册中心、分布式配置中心、分布式事务、分布式调度平台、分布式日志。

2.nacos应用介绍

2.1注册中心

2.1.1注册中心使用背景

在没有注册中心的时候,传统的远程调用技术httpclient存在着连接超时问题、服务访问安全问题、容错率低、服务url难以治理且管理复杂的问题。故这里采用注册中心来对服务进行治理。常用的有zookeeper、eureka、redis、nacos。

2.1.2 注册中心实现原理

生产者先把服务地址注册到注册中心,接着消费者服务在注册中心获取服务url,然后在本地进行rpc调用。

2.1.3 服务注册

注册中心启动时,key为服务名称、value为该服务调用地址,该类型为集合类型。

2.1.4 服务发现

消费者在注册中心获取服务url,然后在本地使用负载均衡策略进行rpc调用。

2.2 nacos基本介绍和下载配置整合springcloud

2.2.1 基本介绍

nacos可实现注册中心和分布式配置中心。其官方文档连接为:https://nacos.io/zh-cn/docs/what-is-nacos.html

2.2.2 nacos下载安装

从github上下载nacos-server-1.1.4.zip,再进行解压。Linux和windows下都可以进行解压安装,只是启动windows是双击startup.cmd文件默认单机,而linux下是使用sh startup.sh命令启动默认集群。若想在linux下单机,则需要执行sh startup.sh -m standalone命令。默认端口号为8848,如需在linux远程访问,则需要防火墙开放访问8848接口权限。Github下载地址是:https://github.com/alibaba/nacos/releases

2.2.3 springCloud整合nacos及相关文件配置

项目里要想使用nacos,需要整合相关的依赖和更改yml配置文件。但是服务治理和在线配置引入的依赖是不一样的,这里给出相关的maven和gradle配置,以及相关yml文件配置。
Maven配置:

<parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.2.1.RELEASE</version>
        <!-- lookup parent from repository -->
 </parent>
<dependencies>
<dependency>
   	<groupId>org.springframework.boot</groupId>
   	<artifactId>spring-boot-starter-web</artifactId>
   	<version>${spring-boot-version}</version>
     </dependency>

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
   <version>0.9.0.RELEASE</version>
</dependency>

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
   <version>0.9.0.RELEASE</version>
</dependency>
</dependencies>

Gradle配置:

compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-alibaba-nacos-discovery', version: '0.9.0.RELEASE'
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-alibaba-nacos-config', version: '0.9.0.RELEASE'

yml文件配置:

spring:
  application:
    #服务名称
    name: sell-admin
  cloud:
    nacos:
      #注册中心相关
      discovery:
        server-addr: localhost:8848
      #配置中心相关
      config:
        server-addr: localhost:8848
        #在线配置文件格式
        file-extension: yaml

注:yml的这些配置应该放在bootstrap.yml文件里。

2.3 负载均衡

2.3.1 ribbon

Springcloud到了第二代默认的负载均衡器为ribbon,它可以直接在RestTemplate相关的spring配置上加入注解@LoadBalancer。其配置和使用如下:
Ribbon配置:

@Bean
@LoadBalanced //用ribbon本地负载均衡注解
public RestTemplate restTemplate() {

    return new RestTemplate();
}

ribbon使用方法:

@Autowired
private RestTemplate restTemplate;

@RequestMapping
public String use2() {

    /*消费者调用*/
    String res = restTemplate.getForObject("http://vo-member/hello", String.class); /*这里是服务名称及调用*/
    return "success, result is " + res;
}

2.3.2 本地负载均衡器原理

消费者服务从注册中心获取到集群地址列表,缓存到本地,接着本地采用负载均衡策略(轮训、随机、权重等),实现rpc远程的调用。

2.3.3 openfeign

OpenFeign是一个Web声明式的Http客户端调用工具,底层封装了httpClient,提供接口和注解形式调用。最大的优点是实现多路复用。其引用和使用方式如下:
maven引入:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
  <version>${spring-boot-version}</version>
</dependency>

使用方法:
先在springboot启动类上加入@EnableFeignClient注解,再编写对应的调用接口。调用接口配置如下:

@FeignClient("vo-nacos-service-member") //里面字符串默认接口名称
public interface MemberServiceFeign {

    @RequestMapping("/getUser")
    String getUser(@RequestParam("id") Long id);
}
@RestController
public class OrderServiceImpl implements OrderService {

    @Autowired
    private MemberServiceFeign memberServiceFeign;

    @RequestMapping("/openFeign")
    public String openFeign() {

        String t = memberServiceFeign.getUser(12L);
        return "result is " + t;
    }
}

注:openfeign默认支持负载均衡,采用post传递。如果不报错则对应的requestMapping注解的请求方法必须一致,而且入口参数必须加入@RequestParam注解并且声明相关名称。

2.4 分布式配置中心

2.4.1使用背景

传统的配置文件方式,一旦配置文件发生变更时,需要重启服务器。这样成本很高。为此分布式配置中心诞生了。
分布式配置中心可以实现配置文件变更时,不必重启服务器。常见的有nacos、携程阿波罗、springcloudconfig三种。

2.4.2 实现原理

首先本地应用和云端建立和保持长连接,再读取配置文件到本地缓存,接着如果云端发生变化,就会通知结果到本地应用,本地应用更改对应的缓存参数。共享的数据可以持久化到数据库里。

2.4.3 使用方法

先安装nacos,再引入对应的maven(见2.2.3节),最后按照如下的方式配置客户端和服务器端。
服务器端配置:
在Naocs平台中创建配置文件: 名称(默认为服务器名称)-版本.properties|yaml;
在这里插入图片描述
客户端配置参考2.2.3节,建立一个bootstrap.yml文件。同时在启动类上加入@RefreshScrope注解。

2.4.4 数据持久化

默认的情况下,分布式配置中心的数据存放到本地data目录下,但是如果nacos集群则无法保证数据的同步性。
在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:
1.安装数据库,版本要求:5.6.5+
2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。

spring.datasource.platform=mysql
db.num=1#数据库数目
db.url.0=jdbc:mysql://localhost:3306/nacos_conf_db?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=fxf

以上参考官方配置文档: https://nacos.io/zh-cn/docs/deployment.html

2.5 nacos集群

修改nacos/conf目录下的cluster.conf,如果没有则创建。修改内容中每一行对应一个nacos的ip地址。cluster.conf内容如下:

###ip和端口号
192.168.83.134:8848
192.168.83.140:8848
192.168.83.141:8848

同时还要修改nacos/conf目录下的application.properties文件,增加数据库相关的配置(相关修改见2.4.4节)。

3 参考文献

每特教育6期springCloudAlibaba
nacos官方文档https://nacos.io/zh-cn/docs/what-is-nacos.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值