• nacos下载、安装、使用,SpringCloud、SpringBoot、SpringCloudAlibaba版本匹配、openfeign、loadbalancer、nacos配置中心


    官网: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 就看到输出了。

  • 相关阅读:
    2020软件工程作业04
    2020软件工程作业03
    一个我一定会完成的web学习项目
    2020软件工程作业02
    2020软件工程作业01
    423团队选题报告
    计算与软件工程作业五
    计算与软件工程第四次作业
    计算与软件工程第三次作业
    计算与软件工程作业二
  • 原文地址:https://www.cnblogs.com/xsj1989/p/16007490.html
Copyright © 2020-2023  润新知