openshell 的个人博客

一天很长,但十年很短。

Open Source, Open Mind,
Open Sight, Open Future!
  menu
110 文章
5051 浏览
0 当前访客
ღゝ◡╹)ノ❤️

(一)Spring Cloud Alibaba之nacos服务注册中心

服务注册中心

本着趁你病,要你命的宗旨,Spring Cloud Alibaba来了!组件之一Nacos就是用来替代Euraka的,作为注册中心Nacos拥有更强大的功能,使用也更加方便。

项目结构:

父工程:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <packaging>pom</packaging>
    <modules>
        <module>provider-payment9002</module>
        <module>provider-payment9003</module>
        <module>consumer-order83</module>
    </modules>

    <groupId>cn.caiqz</groupId>
    <artifactId>cloud2020</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cloud2020</name>
    <description>Demo project for Spring Boot</description>
    <!-- packaging pom 总工程-->
    <!--统一管理jar包版本-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <lombok.version>1.18.10</lombok.version>
        <log4j.version>1.2.17</log4j.version>
        <mysql.version>5.1.47</mysql.version>
        <druid.version>1.1.16</druid.version>
        <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
        <java.version>1.8</java.version>
    </properties>

    <!--子模块继承之后,提供作用:锁定版本+子module不用写groupId和version-->
    <dependencyManagement><!--定义规范,但不导入-->
        <dependencies>
            <!--spring boot 统一依赖管理-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud alibaba 统一依赖管理-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud 统一依赖管理-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

子工程——provider-payment9002

image.png

PaymentMain9002
package cn.caiqz.springcloud.alibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * <p>
 * 服务者主启动类
 * </p>
 *
 * @author openshell
 * @since 2020-07-04
 */
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9002 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain9002.class, args);
    }
}

PaymentController
package cn.caiqz.springcloud.alibaba.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p>
 * 服务提供
 * </p>
 *
 * @author openshell
 * @since 2020-07-04
 */
@RestController
public class PaymentController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id) {
        return "nacos registery, serverPort" + serverPort + "\t id=" + id;
    }

}

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud2020</artifactId>
        <groupId>cn.caiqz</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>


    <artifactId>provider-payment9002</artifactId>
    <modelVersion>4.0.0</modelVersion>
    <description>
        服务提供方1,端口9002
    </description>
    <dependencies>
        <!--引入nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--引入spring boot web支持-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Spring Boot的健康监控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>


</project>
application.yml
server:
  port: 9002
spring:
  application:
    name: payment-provider #服务名称,nacos中会显示此名称。
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.247.130:8848 #nacos地址

子工程——provider-payment9003

子工程——provider-payment9002除了端口改成9003之外没有其他区别。

application.yml
server:
  port: 9003
spring:
  application:
    name: payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.247.130:8848

特别注意服务名要一样,这样才能用nacos做负载。

启动服务

可以在naocs提供的web界面中看到服务注册情况。
image.png
调用服务,nacos默认使用轮询来做负载,所有每次访问的端口会交替。
image.pngimage.png

nacos有多强?

image.png

image.png

CAP

一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance),CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

C:所有节点在同一时间数据是一致的。

A:系统提供的服务必须一直处于可用状态,对每一个操作的请求必须在有限时间内返回结果。

P:即使分区故障仍要对外提供C+A服务,除非整个网络崩了。

服务配置中心

Nacos不仅可以作为服务中心,还能作为配置中心。 同spring cloud一样,在项目初始化时,要保证先从配置中心拉去配置,拉去成功项目才能正确启动。

Spring Boot中配置文件的加载顺序存在优先级,Bootstrap优先级高于application

单节点配置中心

单节点没啥说的,直接用就行了,可以直接在Nacos的web界面中配置,也可以在使用官方api调用来添加配置。
然后需要改下配文件

https://nacos.io/zh-cn/docs/deployment.html

集群配置

预计需要1个Nginx+3个Nacos注册中心+1个MySQL。
三个nacos端口: 3333 4444 5555
环境:linux
数据库:提前安装好MySQL,需要执行 nacos 提供的 conf/nacos-mysql.sql 脚本

使用

新建工程 config-nacos-client3377

image.png

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud2020</artifactId>
        <groupId>cn.caiqz</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>config-nacos-client3377</artifactId>
<dependencies>
<!--nacos-config 配置中心-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!--引入spring boot web支持-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Spring Boot的健康监控-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

</project>

application.yml

spring:
  profiles:
    active: dev

bootstrap.yml

server:
  port: 3377
spring:
  application:
    name: config-nacos-client
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.247.130:8848 #nacos注册中心地址
      config:
        server-addr: 192.168.247.130:8848 #nacos配置中心地址
        file-extension: yaml
#{spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# config-nacos-client-dev.yml

ConfigClientController

package cn.caiqz.springcloud.alibaba.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p>
 *  测试读取配置中心配置
 * </p>
 *
 * @author openshell
 * @since 2020-07-05
 */
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigClientController {

    @Value("${useLocalCache:false}")
    private String useLocalCache;

    @Value("${config.info}")
    private String configInfo;

    /**
     * http://localhost:3377/config/get
     */
    @RequestMapping("/get")
    public String get() {
        return useLocalCache;
    }

    /**
     * http://localhost:3377/config/config/info
     * @return
     */
    @GetMapping("/info")
    public String getConfigInfo(){
        return configInfo;
    }
}

这儿有个坑就是如果你把配置文件写成 .ymlNacos就识别不到。。我的版本是1.3.0
image.png


标题:(一)Spring Cloud Alibaba之nacos服务注册中心
作者:openshell
地址:http://solo.caiqz.cn/articles/2020/07/06/1593966809546.html