官网:https://nacos.io/zh-cn/
1、下载:https://github.com/alibaba/nacos/releases/tag/1.4.3,windows版的是:nacos-server-1.4.3.zip,官网下载慢,网盘下载链接:https://pan.baidu.com/s/1aYY0xfmHx_7hXiGub45Gqg 提取码:7l2t
2、解压后找到bin/startup.cmd,记事本打开,把 set MODE="cluster" (集群模式)修改为 set MODE="standalone"(单机模式),方法二:cmd运行,切到startup.cmd目录,执行startup.cmd -m standalone,
方法三:修改startup.cmd,添加一行 set "NACOS_OPTS=%NACOS_OPTS% -Dnacos.standalone=true"
3、找到conf/nacos-mysql.sql,在本机创建一个数据库(nacos_config),然后执行这个脚本,创建好table。
4、找到conf/application.properties,放开注释

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

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

5、修改数据库连接配置,数据库名称:nacos_config,账号,密码。
6、启动startup.cmd
7、启动成功后,浏览器访问:http://localhost:8848/nacos/#/login,账号密码都是nacos,登录成功。
参考:https://blog.csdn.net/weixin_42982636/article/details/108221299
8、父pom

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2021.0.1.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

子module的pom

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

子module的启动类加注解@SpringBootApplication 和 @EnableDiscoveryClient
nacos文档:https://spring-cloud-alibaba-group.github.io/github-pages/2021/en-us/index.html
spring boot 和 spring cloud的版本匹配信息:https://start.spring.io/actuator/info
springcloud + nacos版本选择:https://blog.csdn.net/qq_38637558/article/details/114448690
SpringCloudAlibaba参考文档:https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/en-us/index.html
9、我配置好nacos,然后建项目,需要注册到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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud22</artifactId>
        <groupId>com.jay.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-provider-payment8001</artifactId>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>2.6.4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2021.0.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.0.1.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>
        <!--mysql-connector-java-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--jdbc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
        <dependency>
            <groupId>com.jay.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>

application.yml文件

server:
  port: 8001

spring:
  application:
    name: cloud-payment-service
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
    driver-class-name: com.mysql.cj.jdbc.Driver              # mysql驱动包
    url: jdbc:mysql://localhost:3306/springcloudtest?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true&failOverReadOnly=false
    username: root
    password: madeinhome
  cloud:
    nacos:
      discovery:
        server-addr: http://localhost:8848
management:
  endpoints:
    web:
      exposure:
        include: '*'
mybatis:
  mapperLocations: classpath:mapper/*.xml
  type-aliases-package: com.jay.springcloud.entities

 main

package com.jay.springcloud;

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

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8001.class, args);
    }
}

 nacos天生支持负载均衡、restTemplate,因为集成了ribbon。克隆一个payment项目,端口设置8003。
10、消费者跟生产者很像。
10.1、pom增加:

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
            <version>3.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>3.1.1</version>
        </dependency>

10.2、加了一个 @Configuration 使用 RestTemplate

package com.jay.springcloud.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

10.3、使用openfeign需要增加service

package com.jay.springcloud.service;

import com.jay.springcloud.common.CommonResult;
import com.jay.springcloud.entities.Payment;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**此处需要是注册进nacos的服务名称(ServiceId),如果不一致会报错*/
@FeignClient(value = "cloud-payment-service")
public interface CloudPaymentService {
    /**方法签名要和注册服务中的一致*/
    @GetMapping(value = "/payment/get/{id}")
    CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
}

10.4、main方法上面要增加注解 @EnableFeignClients

调用:

package com.jay.springcloud.controller;

import com.jay.springcloud.common.CommonResult;
import com.jay.springcloud.entities.Payment;
import com.jay.springcloud.service.CloudPaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;
import java.util.stream.Collectors;

@RestController
@Slf4j
public class OrderController {
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;
    @Autowired
    private CloudPaymentService cloudPaymentService;
    /**
     * 当前请求服务地址
     */
    private int serviceIndex;
    private static final String PAYMENT_SERVICE_ID = "cloud-payment-service";

    /**
     * 轮询请求cloud-payment-service
     * 加入openfeign后就不能用ip加端口的方式请求了
     */
    @GetMapping(value = "/order/payment/get/{id}")
    public String getPaymentById(@PathVariable("id") Long id) {
        List<ServiceInstance> list = this.discoveryClient.getInstances(PAYMENT_SERVICE_ID);
        List<String> targetUrls = list.stream().map(serviceInstance -> serviceInstance.getUri().toString()).collect(Collectors.toList());
        int size = targetUrls.size();
        if (serviceIndex >= size || serviceIndex <= 0) {
            serviceIndex = 0;
        }
        String targetUrl = targetUrls.get(serviceIndex) + "/payment/get/" + id;
        String res = restTemplate.getForObject(targetUrl, String.class);
        serviceIndex++;
        return res;
    }
    /**
     * 使用服务名调用服务(默认轮询调用)
     * */
    @GetMapping(value = "/order/payment/get2/{id}")
    public CommonResult<Payment> getPaymentById2(@PathVariable("id") Long id) {
        CommonResult<Payment> res = restTemplate.getForObject("http://" + PAYMENT_SERVICE_ID + "/payment/get/" + id, new CommonResult<Payment>().getClass());
        return res;
    }

    /**
     * openfeign方式(默认轮询调用)
     */
    @GetMapping(value = "/order/payment/get3/{id}")
    public CommonResult<Payment> getPaymentById3(@PathVariable("id") Long id) {
        return cloudPaymentService.getPaymentById(id);
    }
}

 nacos配置中心,看了很多文章,都没说详细步骤,自己搞。
1、增加引入pom

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.1.1</version>
        </dependency>

2、新增bootstrap.yaml,这yaml优先于application.yaml,注意 file-extension的值是 yaml,那么当新增nacos配置的时候,Data ID的后缀要和这个一样,也得是yaml

server:
  port: 8001
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #Nacos作为服务中心地址
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
  application:
    name: cloud-payment-service #在nacos上新建配置cloud-payment-service-dev.yaml
  profiles:
    active: dev

3、新增ConfigClientController,注意加@RefreshScope,然后才能绑定nacos配置中心的配置信息。

package com.jay.springcloud.controller;

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;

@RestController
@RefreshScope //支持Nacos配置中心动态刷新功能
@RequestMapping("/config")
public class ConfigClientController {
    //绑定的是nacos配置中心发布的配置
    @Value("${config.info}")
    private String configInfo;
    @GetMapping("/info")
    public String getConfigInfo(){
        return configInfo;
    }
}

4、在nacos上新建配置,Data ID要和bootstrap.yaml中的spring.application.name一样,Data ID命名规则:${prefix}-${spring.profiles.active}.${file-extension}
${prefix}:是application name(cloud-payment-service)
${spring.profiles.active}:是当前开发版本spring.profiles.active(dev、test、pro)
${file-extension}:配置格式,文件的后缀名(text、json、xml、yaml、html、properties),一般就选择yaml,和bootstrap.yaml中file-extension配置的要一样。
示例:cloud-payment-service-dev.yaml
配置内容,yaml格式的配置,例如:

config:
    info: this is dev yaml,from nacos config center,version 1.0.1

然后发布配置。
5、启动服务,这时候访问 http://localhost:8001/config/info 就看到输出了。

posted on 2022-03-15 10:52  邢帅杰  阅读(1543)  评论(0编辑  收藏  举报