尝试搭建谷粒商城 记录(四)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                       
原文链接:https://blog.csdn.net/weixin_44190665/article/details/121043585

我是看这位博主的文章 记录一下自己的实践过程

1、分布式组件

父工程引入依赖(已完成)

spring boot === 2.1.8.RELEASE

spring cloud ==== Greenwich.SR3

spring cloud alibaba ==== 2.1.0.RELEASE

1、nacos用作服务注册中心

Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理 平台。他是使用 java 编写。需要依赖 java 环境

1、nacos下载安装

下载地址: https://github.com/alibaba/nacos/releases

解压安装包,直接运行bin目录下的startup.cmd

打开安装目录

cmd中输入命令startup.cmd -m standalone, 以单机模式启动(开发测试阶段用这个, 所以现在用这个)

或者修改startup.cmd文件中的set MODE=“standalone”, 然后就可以双击这文件启动nacos了

另外cmd中输入命令startup.cmd -m cluster是以集群模式启动,这个模式需要创建数据库, 详情网上找教程

访问 http://localhost:8848/nacos/

使用默认的账号密码都是nacos

 

 2、使用nacos
1、yaml文件添加nacos配置信息

在项目里properties里或者yaml文件 写

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

(yaml同理,指定nacos的地址)。

再指定spring.applicatin.name告诉注册到nacos中以什么命名 

2、引入依赖(放入common中) 
<!--        Nacos服务注册/发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

 记得加一个版本管理

<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
        <spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
    </properties>
<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>

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

每次更新gulimall-common记得clean和install一下 

在主启动类上使用 @EnableDiscoveryClient 注解开启服务注册与发现功能

@EnableDiscoveryClient
@SpringBootApplication
public class GulimallCouponApplication {

    public static void main(String[] args) {

        SpringApplication.run(GulimallCouponApplication.class, args);
    }

}
3、启动gulimall-coupon, 查看服务注册中心 

 4、按照以上步骤依次给member/order/product/ware配置

 2、openfegin远程调用

声明式远程调用

feign是一个声明式的HTTP客户端,他的目的就是让远程调用更加简单。给远程服务发的是HTTP请求。

会员服务想要远程调用优惠券服务,只需要给会员服务里引入openfeign依赖,他就有了远程调用其他服务的能力。

1、引入依赖

在微服务模块加入依赖

注意(如果该模块不需要调用别的模块的服务,则不需要使用openfeign, 也就不需要导入该依赖)

<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、演示member服务调用coupon服务 
1、在被调用方 gulimall-coupon中的CouponController中添加调用方法
@RequestMapping("/member/list")
    public R membercoupons(){    //全系统的所有返回都返回R
        // 模拟去数据库查用户对于的优惠券
        CouponEntity couponEntity = new CouponEntity();
        couponEntity.setCouponName("满100-10");//优惠券的名字
        return R.ok().put("coupons",Arrays.asList(couponEntity));
    }
2、调用方 加上注解@EnableFeignClients

在主启动类 加上注解@EnableFeignClients

告诉member是一个远程调用客户端,member要调用东西的

在 EnableFeignClients 注解的 basePackages 属性中定义了一个 io.zdd.gulimall.member.feign 的包名,

这个注解就会告诉 OpenFeign 在启动项目的时候,找到所有位于 io.zdd.gulimall.member.feign包路径(包括子 package)之下使用 FeignClient 修饰的接口,

然后生成相关的代理类并添加到 Spring 的上下文中。这样一来,才能够在项目中用 Autowired 注解注入 OpenFeign 接口。

package io.zdd.gulimall.member.feign;

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

@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients(basePackages = "io.zdd.gulimall.member.feign")//开启Feign客户端,加上类所在的包扫描
public class GulimallMemberApplication {
    public static void main(String[] args) {

        SpringApplication.run(GulimallMemberApplication.class, args);
    }

}
 3、调用方 新建接口 CouponFeignService 

gulimall-member想要远程调用gulimall-coupon服务中的信息,编写一个接口,告诉SpringCloud这个接口需要调用远程服务(创建一个feign文件夹,并且创建对应的feign接口),注意:该接口中的方法是来自被调用服务中信息的方法,并且@RequestMapping中对应的路径一定要写全,声明接口中的 每一个方法都是调用哪个远程服务的那个请求

package io.zdd.gulimall.member.feign;

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

@FeignClient("gulimall-coupon")//告诉spring cloud这个接口是一个远程客户端,要调用coupon服务(nacos中找到)
public interface CouponFeignService {

    // 远程服务的url
    @RequestMapping("/coupon/coupon/member/list")//注意写全优惠券类上还有映射
    public R membercoupons();//得到一个R对象

}

4、调用方 的MemberController写一个测试

在gulimall-member服务中编写一个请求调用gulimall-coupon服务中的方法信息,下面的测试会返回两个信息,一个是gulimall-member服务本地的信息,另外一个是调用gulimall-coupon服务中的信息从而得到的信息

@Autowired
    private CouponFeignService couponFeignService; //注入刚才的CouponFeignService接口

    @RequestMapping("/coupons")
    public R coupons(){
        MemberEntity memberEntity = new MemberEntity();
        memberEntity.setNickname("会员昵称张三");
        R membercoupons = couponFeignService.membercoupons();

        return R.ok().put("member", memberEntity).put("coupons", membercoupons.get("coupons"));
    }
5、测试

启动gulimall-member,gulimall-coupon项目。

访问localhost:8000/member/member/coupons测试

成功啦~~~(~ ̄▽ ̄)~

3、nacos用作配置中心

1、common中添加依赖

nacos配置中心

<!-- nacos配置中心来做配置管理-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
2、在coupons项目中创建bootstrap.yml

 /src/main/resources/bootstrap.yml,

 application.properties 文件 优先级别 > yml 文件 配置信息

# 改名字,对应nacos里的配置文件名
spring:
  application:
    name: gulimall-coupon
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml # 指定配置文件为yaml格式
3、nacos添加配置

浏览器去nacos里的配置列表,点击+号,data ID:gulimall-coupon.yaml,配置

4、在controller中编写测试代码 
@Value("${coupon.user.name}")
    private String name;

    @Value("${coupon.user.age}")
    private int age;

    @RequestMapping("/nacos")
    public R nacos(){
        return R.ok().put("name", name).put("age", age);
    }
5、访问http://localhost:7000/coupon/coupon/nacos测试 

6、在coupon的控制层上加@RefreshScope支持动态刷新
7、新建coupon、member、order、product、ware五个命名空间分别保存自己的配置文件 

nacos说明:
最终方案:每个微服务创建自己的命名空间,然后使用配置分组区分环境(dev/test/prod) 

我在 7 这个步骤 暂时还没有使用 后续有需要再执行吧 

 4、网关gateway-88

1、新建gulimall-gateway网关模块

网关模块项目,引入依赖

<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR3</spring-cloud.version>
        <spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>com.zdd.gulimall</groupId>
            <artifactId>gulimall-common</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- Maven整个生命周期内排除内置容器,排除内置容器导出成war包可以让外部容器运行spring-boot项目-->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>
 2、nacos 浏览器 配置信息

在nacos上新建gateway命名空间,在命名空间中新建配置gulimall-gateway.yaml

 

3、nacos 服务注册发现

配置application.yml

server:
  port: 88
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  application:
    name: gulimall-gateway

 4、nacos 配置信息

配置bootstrap.yml

spring:
  application:
    name: gulimall-gateway
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        namespace: 

(注:从网上搜到的资料中 ,这个namespace 都是有值的 ,但是,我还不清楚 这个值的value是从哪里来的 我先给空着了 有了解的友友 麻烦告诉我一下 谢谢啦~ )

 4、主启动类
package com.atguigu.gulimall;

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

/**
 * 1、开启服务注册发现
 *  (配置nacos的注册中心地址)
 * 2、编写网关配置文件
 */
@EnableDiscoveryClient
// 网关服务不需要数据库的配置,这里排除数据库的配置,不排除引入common依赖会报错
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class GulimallGatewayApplication {

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

}
 5、测试

测试访问http://localhost:88?url=baidu 切换到百度, http://localhost:88?url=qq 切换到qq

在网关的application.yml中配置路由

server:
  port: 88
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      routes:
        - id: baidu_route              # 每一个路由的名字,唯一即可
          uri: https://www.baidu.com   # 匹配后提供服务的路由地址
          predicates: # 断言规则
            - Query=url,baidu         #如果url参数等于baidu 符合断言,转到uri

        - id: qq_route                  # 每一个路由的名字,唯一即可
          uri: https://www.qq.com   # 匹配后提供服务的路由地址
          predicates: # 断言规则
            - Query=url,qq         #如果url参数等于baidu 符合断言,转到uri

  application:
    name: gulimall-gateway

启动网关,访问http://localhost:88?url=baidu测试,成功!

 注:有关详细gateway资料 可以查看下面这位博主的原创文章 感谢

 (版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a745233700/article/details/122917167)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值