Nacos

微服务理念

它是一种设计风格,目的是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间一般通过HTTP的RESTfUL API进行通信写作。

restful风格

数据的增删改查,使用http的不同方式,数据传输用json
查询:GET 新增:POST 修改:PUT 删除:DELETE
在这里插入图片描述

RestTemplate完成远程调用

Spring提供一种简单的模板类,用于访问restful服务与HttpClient类似

@Configuration
public class ConfigBean {

	@Bean
	public RestTemplate restTemplate(){
		return new RestTemplate();
	}
}

Nacos注册中心

在这里插入图片描述

nacos启动

./startup.sh -m standalone #非集群模式启动

在nacos中注册后
在这里插入图片描述这两个服务对外暴露restful接口,用户调用消费者,消费者从注册中心发现得到生产者的服务信息(IP和端口号),通过RestTemplate调用生产者返回数据

演示例子
在这里插入图片描述
consumer消费者 controller

@RestController
@RequestMapping("/consumer")
public class ConsumerController {
    //访问Rest服务的客户端
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient  discoveryClient;
    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable("id")Integer id){
     //获取nacos中注册的所有服务信息
        List<String> services = discoveryClient.getServices();
        for (String service : services) {
            System.out.println(service);
        }
        //获取nacos中注册的指定服务信息
        ServiceInstance serviceInstance = discoveryClient.getInstances("nacos-provider").get(0);
        String service1=serviceInstance.getHost()+":"+serviceInstance.getPort();
        String url="http://"+service1+"/provider/getUserById/"+id;
        return restTemplate.getForObject(url,User.class);
    }
}

ConfigBean

@Configuration
public class ConfigBean {
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

启动类

@SpringBootApplication
@EnableDiscoveryClient//向注册中心注册该服务,并可以获取其他服务的调用地址
public class ConsumerApp {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApp.class);
    }
}

application.yml

server:
  port: 8080
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.112.130 #nacos服务的地址
  application:
    name: nacos-consumer

导入依赖

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

provider生产者 controller

@RestController
@RequestMapping("/provider")
public class ProviderController {
    @Autowired
    private UserService userService;

    @RequestMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id){
        return userService.getUserById(id);
    }
}

application.yml

server:
  port: 8080
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.112.130 #nacos服务的地址
  application:
    name: nacos-consumer

导入依赖

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

测试
http://localhost:8080/consumer/getUserById/1
如图,消费者发送请求成功响应数据
在这里插入图片描述

Nacos配置中心

配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。

配置文件无法区分环境。微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。

配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。

配置中心的思路就是

  1. 首先把项目中各种配置全部都放到一个集中的地方进行统一管理。
  2. 当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
  3. 当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。

在这里插入图片描述
在这里插入图片描述

Nacos配置隔离

通过namespace,group,dataid定位到一个配置集,
nacos实现配置管理和动态配置刷新
1.添加对应的spring-cloud-starter-alibaba-nacos-config依赖
2.使用注解@Value导入配置
3.使用@RefreshScope刷新配置
4.根据自己的业务场景做好多环境配置隔离(Namespace)不同业务配置隔离(Group)
5.命名空间和分组的配置一定要放在bootstrap.yml或者bootstrap.properties配置文件中

在这里插入图片描述在这里插入图片描述

  • Namespace: 代表不同的环境的配置隔离, 如: 开发、测试, 生产等
  • Group: 可以代表某个项目, 如XX医疗项目, XX电商项目
  • DataId: 每个项目下往往有若干个工程, 每个配置集(DataId)是一个工程的主配置文件

获取配置集需要指定:
1.nacos服务地址,必须指定
2.namespace,如果不指定默认为public
3.group,如果不指定默认DEFAULT_GROUP
4.dataId,必须指定

示例
在Nacos建立配置文件
在这里插入图片描述新建工程导入依赖
在这里插入图片描述

 <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

编写bootstrap.yml

spring:
  cloud:
    nacos:
      config:
        server-addr: 192.168.112.130:8848 #配置中心地址
        file-extension: yaml #配置文件后缀名
        prefix: nacos-config #配置文件前缀名

编写controller读取配置文件信息(采用bootstrap.yml方式只识别配置中心拉取下来的数据才有效果,如果在bootstrap.yml中进行服务的的注册配置将无效果,当所要读取的配置文件不存在的时候会直接报错)

@RestController
@RefreshScope //重新从BeanFactory获取一个新的实例(该实例使用新的配置)
public class ConfigController {
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;
    @Value("${spring.datasource.type}")
    private String type;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        System.out.println(this);
        String configInfo = driverClassName+"<br>"+url+"<br>"+username+"<br>"
                +password+"<br>"+type;
        return configInfo;
    }
}

启动
在这里插入图片描述成功注册服务
在这里插入图片描述当配置文件修改后,通过@RefreshScope注解重新从BeanFactory获取一个新的实例,对配置文件的信息重新赋值达到更新配置信息的效果
在这里插入图片描述

由此可以推测大概的工作流程就是:服务启动根据配置中心的地址和配置文件名,在配置中心找到该文件,将内容交给springboot读取,可以想象成把配置中心的配置信息加载到springboot中的配置文件读取。

Nacos集群和持久化

为什么要进行持久化,当我们使用集群的时候使用Nacos自带的derby数据库无法实现多台Nacos中数据的同步,我们需要使用mysql作为Nacos的数据源

修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql,版本要求:5.6.5+)

### If use MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://192.168.31.19:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=1111

Nacos集群

在这里插入图片描述
集群搭建
1.找到conf/cluster.conf.example ,将其改名为 conf/cluster.conf
在这里插入图片描述在这里插入图片描述2.复制三份Nacos

[root@localhost bin]# cd /usr/local
[root@localhost java]# mkdir nacos_cluster
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8848
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8849
[root@localhost java]# cp -r nacos nacos_cluster/nacos_8850

在这里插入图片描述
3.修改每台的端口号
在这里插入图片描述在这里插入图片描述4.安装Nginx
(1)安装nginx依赖库

yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

(2)下载Nginx

wget -c https://nginx.org/download/nginx-1.12.0.tar.gz

(3)解压

tar -zxvf nginx-1.12.0.tar.gz

(4)配置nginx

cd nginx-1.12.0
./configure --prefix=/usr/local/nginx

(5)./configure配置nginx安装到/usr/java/nginx目录下
编译并安装

make && make install

5.配置nginx代理nacos
在这里插入图片描述
在这里插入图片描述测试
1,启动集群

[root@localhost upload]# cd /usr/local/nacos_cluster/nacos_8848/bin
[root@localhost bin]# ./startup.sh
[root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8849/bin
[root@localhost bin]# ./startup.sh
[root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8850/bin
[root@localhost bin]# ./startup.sh

2,启动Nginx

[root@localhost nginx]# cd /usr/local/nginx/sbin/
[root@localhost sbin]# ./nginx 

通过Nginx负载均衡访问Nacos
http://192.168.112.130/nacos/
添加配置文件并启动服务通过Nginx注册到Nacos
在这里插入图片描述此时三台Nacos都能读取到该配置文件
该文件在Mysql的位置
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

访问端口为8848的Nacos

在这里插入图片描述在这里插入图片描述

访问端口为8849的Nacos
在这里插入图片描述在这里插入图片描述

访问端口为8850的Nacos
在这里插入图片描述在这里插入图片描述同时三台nacos都能读取到相同的配置文件,所以Nginx负载均衡保证了Nacos集群的数据(服务信息)同步,使用Mysql作为Nacos的数据源保证了Nacos集群配置文件信息的同步。

至少三台Nacos主要是因为Nginx负载均衡需要选取老大
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值