程序员的资源宝库

网站首页 > gitee 正文

Spring cloud AlibabaSpring Bootnacos

sanyeah 2024-04-13 16:16:11 gitee 5 ℃ 0 评论

  1. Spring Cloud Alibaba引用版本
    <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>
  1. springboot引用版本:
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
  1. Nacos-Windows版本:nacos-server-2.1.1
  2. spring-cloud-starter-openfeign依赖spring-cloud-starter-loadbalancer
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

a.小提示:在SpringBoot 2.4.x的版本之后,对于bootstrap.properties/bootstrap.yaml配置文件(我们合起来成为Bootstrap配置文件)的支持,需要导入如下的依赖,参考连接:https://blog.csdn.net/GCTTTTTT/article/details/126660215

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.0.4</version>
        </dependency>
  1. spring cloud alibaba是Spring Cloud的子项目,所以使用也需要在各个组件中引用spring cloud,下面是其中一个组件gulimall-coupon的pom文件
<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.atguigu.gulimall</groupId>
    <artifactId>gulimall-coupon</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gulimall-coupon</name>
    <description>谷粒商城-优惠券服务</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.4</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.atguigu.gulimall</groupId>
            <artifactId>gulimall-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>7.4.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>


    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</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>
  1. gulimall-common为公共组件,因为被其他组件共同使用,所以为公共.
<?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>gulimall</artifactId>
        <groupId>com.atguigu.gulimall</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>gulimall-common</artifactId>
    <description>每个微服务公共依赖,比如bean或工具类</description>

    <dependencies>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.0</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>4.4.14</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>


        <dependency>
            <groupId>io.renren</groupId>
            <artifactId>renren-fast</artifactId>
            <version>3.0.0</version>
            <scope>compile</scope>
        </dependency>

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

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

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

    </dependencies>

    <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>


</project>
  1. 在公共组件中引入spring-cloud-starter-alibaba-nacos-discovery,在application.yml中引入nacos服务器地址:
spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://192.168.1.7:3306/gulimall_sms
    driver-class-name: com.mysql.jdbc.Driver
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: gulimall-coupon
mybatis-plus:
  mapper-locations: classpath:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto

server:
  port: 7000
  1. 在主启动类启用nacos注解@EnableDiscoveryClient,然后启动服务.
  2. 登录nacos网站http://127.0.0.1:8848/nacos/index.html#/login,用户名密码均为nacos,在服务管理->服务列表中查看发现并上线的服务.列表中显示的服务名是application.yml中指定的application:name名
  3. 创建组件时每个组件都已经引入feign,可以远程调用,这里先在gulimall-member中编写一个CouponFeignService接口:
package com.atguigu.gulimall.member.feign;

import com.atguigu.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient("gulimall-coupon")
public interface CouponFeignService {

    @RequestMapping("/coupon/coupon/member/list")
    public R membercoupons();
}

@FeignClient("gulimall-coupon")是Feign注解必须的,gulimall-coupon表示要远程调用那个服务,调用coupon服务中的那个请求?可以直接复制coupon服务中的请求代码,这里是@RequestMapping("/coupon/coupon/member/list") public R membercoupons();
11. 然后再member服务主启动类添加注解@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")扫描带注解的包
12. 测试访问请求:http://localhost:8000/member/member/coupons

使用ncos配置中心

  1. 首先common组件引入maven包
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

2.新增src\main\resources\bootstrap.properties配置文件,配置 Nacos server 的地址和应用名

spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#spring.cloud.nacos.config.refresh-enabled=true
#spring.cloud.nacos.config.enable-remote-sync-config=true

在application.properties中配置键值

coupon.user.name=zhangsan2
coupon.user.age=18

这里的参数值可以通过@Value注解获得


    @Value("${coupon.user.name}")
    private String name;
    @Value("${coupon.user.age}")
    private Integer age;

    @RequestMapping("/test")
    public R test(){
        return R.ok().put("name",name).put("age",age);
    }

写在配置文件中的参数修改需要重启应用,使用nacos无需重启应用,登录http://localhost:8848/nacos/index.html#,
配置管理->配置列表->新建配置,


Data Id就是配置文件中的应用名:spring.application.name=gulimall-coupon
3. 然后在control中需要请求的类中添加注解@RefreshScope


然后测试访问:

命名空间管理

Nacos 基于Namespace 帮助用户逻辑隔离多个命名空间,这可以帮助用户更好的管理测试、预发、生产等多环境服务和配置


创建好命名空间后,先选择命名空间,再创建配置:

最后在bootstrap.properties中指定prop的命名空间ID值spring.cloud.nacos.config.namespace=1b64f1ec-e3aa-46ff-9e7e-107618bae01d

  1. 也可以基于每个组件服务配置单独的命名空间配置管理

  1. 可以在不同的命名空间下创建分组:

注意在配置文件中不同的分组要在同一命名空间下,否则不生效.

*2023.4.25日追加:如果想在服务管理服务列表中按照命名空间划分配置,需要配置--spring.cloud.nacos.discovery.namespace=prod --spring.cloud.nacos.discovery.group=test
prod为命名空间,test为group.

将所有配置写在nacos上,我们注释掉本地的配置application.yml

#spring:
#  datasource:
#    username: root
#    password: 123456
#    url: jdbc:mysql://192.168.1.7:3306/gulimall_sms
#    driver-class-name: com.mysql.jdbc.Driver
#  cloud:
#    nacos:
#      discovery:
#        server-addr: 127.0.0.1:8848
#  application:
#    name: gulimall-coupon
#mybatis-plus:
#  mapper-locations: classpath:/mapper/**/*.xml
#  global-config:
#    db-config:
#      id-type: auto
#
#server:
#  port: 7000

将以上配置写在nacos上,首先指定spring.cloud.nacos.config.namespace=a84ad...,这是将coupon的配置全部写在coupon命名空间里的配置中

然后在bootstrap.properties中继续填nacos具体的配置如下:

spring cloud gateway

小提示:目前使用的的gateway版本是3.1.4,gateway中集成了org.springframework.boot:spring-boot-starter-webflux:2.6.6,这和spring-boot-starter-web会出现冲突,如果出现冲突,根据错误提示反馈:Please set spring.main.web-application-type=reactive or remove spring-boot-starter-web dependency,我测试了第一种方法有效,在application.properties中添加spring.main.web-application-type=reactive

  1. gateway组件先不使用数据库,所以主启动类先不启用数据库连接类,否则报错无法连接数据库

/*开启服务注册发现*/
@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class ,})
public class GulimallGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallGatewayApplication.class, args);
    }

}
  1. gateway功能之一:Query路由断言接受两个参数:一个必需的参数和一个可选的regexp(这是一个Java正则表达式)。配置查询路由断言(谓词)的application.yml配置示例如下:
spring:
  cloud:
    gateway:
      routes:
        - id: test_route
          uri: https://www.baidu.com
          predicates:
            - Query=url,baidu

        - id: qq_route
          uri: https://www.qq.com
          predicates:
            - Query=url,qq

访问测试http://localhost:88/hello?url=qq 如果请求连接中包含url=qq的查询参数,那么就会跳到https://www.qq.com/hello上.
参考连接:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories中的5.9. The Query Route Predicate Factory章节

  1. ES6 Promise 对象示例:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
</head>

<body>

<script>
    //1、查出当前用户信息
    //2、按照当前用户的id查出他的课程
    //3、按照当前课程id查出分数
    // $.ajax({
    //     url: "mock/user.json",
    //     success(data) {
    //         console.log("查询用户:", data);
    //         $.ajax({
    //             url: `mock/user_corse_${data.id}.json`,
    //             success(data) {
    //                 console.log("查询到课程:", data);
    //                 $.ajax({
    //                     url: `mock/corse_score_${data.id}.json`,
    //                     success(data) {
    //                         console.log("查询到分数:", data);
    //                     },
    //                     error(error) {
    //                         console.log("出现异常了:" + error);
    //                     }
    //                 });
    //             },
    //             error(error) {
    //                 console.log("出现异常了:" + error);
    //             }
    //         });
    //     },
    //     error(error) {
    //         console.log("出现异常了:" + error);
    //     }
    // });


    // 1、Promise可以封装异步操作
    /*    let p = new Promise((resolve, reject) => {
            //1、异步操作
            $.ajax({
                url: "user.json",
                success: function (data) {
                    console.log("查询用户成功:", data)
                    resolve(data);
                },
                error: function (err) {
                    reject(err);
                }
            });
        });

        //这里的的obj是上面成功传过来的data,用resolve将成功的数据往下传,reject将失败的数据往下传
        p.then((obj) => {
            return new Promise((resolve, reject) => {
                $.ajax({
                    url: `user_corse_${obj.id}.json`,
                    success: function (data) {
                        console.log("查询用户课程成功:", data)
                        resolve(data)
                    },
                    error: function (err) {
                        reject(err)
                    }
                })
            })

        }).then((data)=>{
            console.log("上一步的结果",data)
            $.ajax({
                url: `corse_score_${data.id}.json`,
                success: function (data) {
                    console.log("查询课程得分成功:", data)
                    resolve(data)
                },
                error: function (err) {
                    reject(err)
                }
            })
        })*/





            function get(url, data) {
                return new Promise((resolve, reject) => {
                    $.ajax({
                        url: url,
                        data: data,
                        success: function (data) {
                            resolve(data);
                        },
                        error: function (err) {
                            reject(err)
                        }
                    })
                });
            }

            get("user.json")
                .then((data) => {
                    console.log("用户查询成功~~~:", data)
                    return get(`user_corse_${data.id}.json`);
                })
                .then((data) => {
                    console.log("课程查询成功~~~:", data)
                    return get(`corse_score_${data.id}.json`);
                })
                .then((data)=>{
                    console.log("课程成绩查询成功~~~:", data)
                })
                .catch((err)=>{
                    console.log("出现异常",err)
                });

</script>
</body>

</html>

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表