记录一下在学习谷粒商城时搭建微服务项目过程中遇到的一些问题

谷粒商城

使用nacos作为配置中心

1、引入配置中心依赖

<!--使用nacos作为配置中心的依赖-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--不引入该依赖无法读取bootstrap.properties文件中的属性-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

2、在resources目录下创建bootstrap.properties配置文件并导入spring-cloud-starter-bootstrap依赖读取bootstrap.properties配置文件中的属性

3、在bootstrap文件中配置服务应用名跟nacos配置中心地址

#服务应用名
spring.application.name=gulimall-coupon
#nacos配置中心地址
spring.cloud.nacos.config.server-addr=192.168.174.101:8848

4、在nacos服务的配置列表中创建配置文件,默认读取配置文件名称为当前服务名或者当前服务应用名.properties配置文件中的属性,可以使用spring自带的@Value("${属性名}")或者@ConfigurationProperties注解来读取配置属性,需要动态刷新读取配置属性的话可以在使用@RefreshScope注解进行配置

配置中心进阶用法

配置中心有四个注意点,分别是命名空间(配置隔离)、配置集id(data-id)配置集配置分组(Group)

命名空间:默认创建的所有文件都是在public命名空间

​ 1、可以分为dev开发环境,test测试环境,prod生产环境创建命名空间进行配置隔离

​ 需要在bootstrap文件中使用spring.cloud.nacos.config.namespace=e34e0a52-541b-46ff-9106-7c6f1f95a5b6指定命名空间

​ 2、可以根据服务创建每个微服务自己的命名空间读取自己服务的配置文件

配置集id:就是nacos配置列表是配置文件的data-id,类似于配置文件名

配置集:配置文件的集合,就是所有的配置文件属性

配置分组:所有新建的配置文件默认在DEFAULT_GROUP分组,在一个命名空间下可以对配置文件进行分组,相当于对配置文件进行第二次的细分,可以在bootstrap文件中使用spring.cloud.nacos.config.group属性加载指定分组的属性,也可以在指定命名空间后进行二次筛选

5、在nacos配置中心中加载多个配置集,在bootstrap文件中使用spring.cloud.nacos.config.extension-configs属性可以指定多个配置集来加载,该属性为一个List集合,在properties文件中可以使用下标来配置集合,yml文件中使用 - 配置集合

注意:在使用nacos作为配置中心并且加载多配置集的时候,data-id一定要已yml作为后缀名,其他后缀名没有测试,应该properties跟yaml都可以,例如数据源配置集需取名叫datasource.yml,如果直接叫datasource的话会读取不到配置文件。最终配置完成后我们可以将application.properties中的所有配置全部移到配置中心里面进行远程读取。

最后的bootstrap.properties文件

#spring应用实例列明
spring.application.name=gulimall-coupon
#nacos配置中心地址
spring.cloud.nacos.config.server-addr=192.168.174.101:8848
#指定配置中心命名空间
spring.cloud.nacos.config.namespace=da25e84c-5cab-4430-b55d-4500edc52e08
#指定命名空间分组
spring.cloud.nacos.config.group=dev
#加载多配置文件
#指定数据集id
spring.cloud.nacos.config.extension-configs[0].data-id=datasource.yml
#指定分组
spring.cloud.nacos.config.extension-configs[0].group=dev
#是否动态刷新配置集属性,默认false
spring.cloud.nacos.config.extension-configs[0].refresh=true

spring.cloud.nacos.config.extension-configs[1].data-id=mybatisplus.yml
spring.cloud.nacos.config.extension-configs[1].group=dev
spring.cloud.nacos.config.extension-configs[1].refresh=true

spring.cloud.nacos.config.extension-configs[2].data-id=other.yml
spring.cloud.nacos.config.extension-configs[2].group=dev
spring.cloud.nacos.config.extension-configs[2].refresh=true

配置中心yml配置文件属性

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

----------------------------------------------------------------------------华丽的分割线----------------------------------------------------------------------------

使用openfeign进行服务远程调用

1、引入openfeign依赖,新版本openfeign需要引入spring-cloud-starter-loadbalancer依赖,不然会报错
2023-07-23 21:38:22.408 ERROR 5924 — [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘memberController’: Unsatisfied dependency expressed through field ‘productFeignService’; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘com.lang.gulimall.member.feign.ProductFeignService’: Unexpected exception during bean creation; nested exception is java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?

<!-- openfeign远程调用依赖-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 解决引入openfeign依赖后扫描 @FeignClient 注解报错 -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

2、创建远程调用接口,在接口上方使用@FeignClient("gulimall-product")注解进行声明式调用,注解的value值填写的是nacos服务中的服务名,其接口内部的方法在进行远程调用时需要填写远程服务接口的全路径名,否则会报404请求路径错误,且请求方式需要跟远程接口接收的请求方式一致,否则会报405请求方式错误

/**
 * 使用@FeignClient注解进行远程调用
 * 需指定远程调用服务中心的哪个服务名称
 */
@FeignClient("gulimall-product")
public interface ProductFeignService {

    /**
     * 这里使用@RequestMapping请求到指定服务的目标接口,如果需要传递参数可以在形参中填写
     * 如果目标接口使用的PostMapping会报错405 因为使用@RequestMapping注解是发默认Get请求
     * @return
     */
    @RequestMapping("product/productattrvalue/test")
    public R test();

    @RequestMapping("product/productattrvalue/list")
    public R list(@RequestParam Map<String, Object> params);
}

//---------------------------------------------华丽的分割线--------------------------------------------------
//远程gulimall-product服务的接口路径
@RestController
@RequestMapping("product/productattrvalue")
public class ProductAttrValueController {
    @Autowired
    private ProductAttrValueService productAttrValueService;

    @RequestMapping("/test")
    public R test(){
        List<ProductAttrValueEntity> list = productAttrValueService.list();
        return R.ok().put("lists",list);
    }

    /**
     * 列表
     */
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params){
        PageUtils page = productAttrValueService.queryPage(params);

        return R.ok().put("page", page);
    }
}

3、在启动类上使用@EnableFeignClients(basePackages = "com.lang.gulimall.member.feign")注解对指定包下标志了@FeignClient("gulimall-product")注解的远程调用接口进行扫描

/**
 * 进行feign远程调用需要进入feign依赖
 * 使用EnableFeignClients注解指定basePackages扫描指定包下的接口进行远程调用
 * 新版本openfeign需要引入spring-cloud-starter-loadbalancer依赖
 * 不然会报错找不到该依赖
 */
@EnableFeignClients(basePackages = "com.lang.gulimall.member.feign")
@SpringBootApplication
@EnableDiscoveryClient//标志被nacos注册中心发现
@MapperScan("com.lang.gulimall.member.dao")
public class GulimallMemberApplication {

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

}

----------------------------------------------------------------------------华丽的分割线----------------------------------------------------------------------------

使用nacos作为服务注册中心

1、引入spring-cloud-starter-alibaba-nacos-discovery依赖

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

2、在application.yaml文件中配置服务名称(spring.application.name)

​ 以及nacos服务地址(spring.cloud.nacos.discovery.server-addr)

spring:
  application:
    name: gulimall-coupon
  cloud:
  	# nacos服务注册中心地址
    nacos:
      discovery:
        server-addr: 192.168.174.101:8848

3、在启动类上开启 @EnableDiscoveryClient 注解,表示当前服务可以被注册中心发现

----------------------------------------------------------------------------华丽的分割线----------------------------------------------------------------------------

谷粒商城使用的依赖版本

    <!--springboot版本-->	
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

	<!--spring cloud依赖版本管理-->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>2020.0.1</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

    <!--spring cloud alibaba依赖版本管理-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

----------------------------------------------------------------------------华丽的分割线----------------------------------------------------------------------------

使用VMware跟centos7搭建虚拟机

下载contOS7.iso镜像文件,并且在VMware机上安装linux系统,具体安装方式请看csdn:

使用VMware安装CentOS7的步骤_LazyKing-qi的博客-优快云博客

!注意配置虚拟机网络模式为NST模式并设置IP地址跟网关地址并确保本地VMware虚拟机的VMnet8的ip跟linux的ip为同一网段

本地VMnet8的IP配置

虚拟机VMnet8的IP配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zuo_2001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值