微服务(分布式)组件-nacos注册/配置中心/feign远程调用

 

1.项目要使用的组件

2.版本对应:

 

3.在gulimail-common 导入SpringCloudAlibaba的依赖:
 

 <!--springcloudalibaba-->
    <!--<dependencyManagement>表示依赖管理,以后在<dependencies>引入alibaba相关依赖就不需要写版本号-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

 4.nacos作为注册中心:

在common引入nacos服务注册发现依赖:

 <!--nacos服务注册发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

下载nacos服务器并启动:

 

在yml文件中配置注册中心地址:

#配置nacos服务器注册中心地址
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

 在启动类加@EnableDiscoveryClient注解:服务注册发现

@EnableDiscoveryClient

 在yml文件中给服务起名:

  #为服务定义自己的名字,这样才能在注册中心看到注册的名字
  application:
    name: gulimail-coupon

5.注册好两个服务之后测试远程调用,远程调用使用Feign组件


 

(1)member会员服务想要调用coupon优惠卷服务,需要在会员服务中加入openfeign依赖,这样他就具有了调用其他服务的能力。

<!--远程调用feign组件依赖,具有了调用其他服务的能力-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

(2) 在优惠卷服务gulimail-coupon的controller中写获取某个会员的所有优惠卷功能:

@RequestMapping("/member/list")
    public R membercoupons(){
        CouponEntity couponEntity = new CouponEntity();
        couponEntity.setCouponName("满100减10");
        return R.ok().put("coupons",Arrays.asList(couponEntity));
    }

 (3)会员服务调用优惠卷服务中查询某个会员所有优惠卷的方法:在会员服务中:

编写一个接口,告诉springcloud这个接口需要调用的远程服务

创建feign包,创建CouponFeignService接口:(接口中需要写@FeignClient("gulimail-coupon")注解,写好需要调用的服务名,需要调用哪个功能,就引入优惠卷服务哪个方法,并将方法的路径写全)

package com.atguigu.gulimail.member.feign;

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

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

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

(4)开启远程调用功能,在会员服务的启动类中加注解

@EnableFeignClients(basePackages = "com.atguigu.gulimail.member.feign")并告诉feign包的路径,服务启动时会自动扫描feign包下的远程调用接口
package com.atguigu.gulimail.member;

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


/*
* 想要远程调用别的服务:
* 1.需要引入openfeign
* 2.编写一个接口,告诉springcloud这个接口需要调用远程服务
*  (1)声明接口的每一个方法都是调用哪个远程服务的哪个请求
* 3.开启远程调用功能@EnableFeignClients
*
* */
@EnableFeignClients(basePackages = "com.atguigu.gulimail.member.feign")
@EnableDiscoveryClient
@SpringBootApplication
public class GulimailMemberApplication {

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

}

(5)在会员controller中调用优惠卷服务:
 

@RestController
@RequestMapping("member/member")
public class MemberController {
    @Autowired
    private MemberService memberService;

    @Autowired
    private CouponFeignService couponFeignService;

    /*
    * 调用优惠卷服务
    * */
    @RequestMapping("/coupons")
    public R test(){
        MemberEntity memberEntity = new MemberEntity();
        memberEntity.setNickname("张三");
        R membercoupons = couponFeignService.membercoupons();
        return R.ok().put("member", memberEntity).put("coupons", membercoupons.get("coupons"));
    }

(6)一开始服务启动失败,原因是springboot与springcloud的版本对应问题:

 远程访问成功:访问路径:http://localhost:8000/member/member/coupons

 6.nacos作为配置中心:

项目中使用配置中心的优势:如果不使用配置中心,如果项目需要修改配置文件,则又需要重新打包发布,非常的麻烦。使用配置中心后,只需要在配置中心进行修改就行,项目不需要重新打包。

(1)在comon中引入nacos作为配置中心的依赖:

 <!--nacos作为配置中心依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

(2)在coupon服务中创建bootstrap.properties文件:(这是springboot规定的名字,它会优先于application.properties/yml加载读取)

a.获取本地配置文件值的方法:@Value("${user.name}")

application.properties:

c.user.name= dlf

CouponController:

@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;

    @Value("${c.user.name}")
    private String name;
    @RequestMapping("/test")
    public R test(){
        return R.ok().put("name",name);
    }

获取成功:

 

 

b.进行改造,将配置文件放在配置中心,现在nacos中创建gulimail-coupon.properties,因为之前在bootstrap中进行了配置,服务会自动找到nacos中对应的gulimail-coupon.properties

 

 如果在配置中心中将dlf改为zhangsan,想要在代码中动态的读取到已经改变的值,需要在CouponController:加入一个注解:

@RefreshScope

7.nacos配置中心的命名空间:

a.开发,测试,线上生产环境(发布后)不同环境的配置可能不一样,可以创建不同的命名空间存放不同环境的配置进行隔离:

(1)新建命名空间:

 

 (2)在开发环境命名空间进行配置:

 

 

(3)在bootstrap.properties中指定使用dev命名空间的配置:

#当前服务的名字
spring.application.name=gulimail-coupon
#配置中心的地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#指定使用哪个命名空间
spring.cloud.nacos.config.namespace=89700824-406b-49db-b2e1-97b6510a7a3f

(4)测试成功:

 

 

b.如果每个服务有超多的配置文件,加上有很多个服务,可以让每一个微服务之间相互隔离配置,每一个微服务都创建自己的命名空间:

c. 配置分组:默认所有的配置集都属于:DEFAULT_DROUP

我们可以自定义组,在bootstrap中指定使用哪个组的配置:

#当前服务的名字
spring.application.name=gulimail-coupon
#配置中心的地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#指定使用哪个命名空间
spring.cloud.nacos.config.namespace=c3849876-f08a-48fc-8d08-e7155ec4dc25
#指定使用哪个组的配置文件(不配置的话时候默认组)
spring.cloud.nacos.config.group=1111

 

d.在谷粒项目中:每个微服务都创建自己的命名空间,使用配置分组区分环境:dev,test,prop

 

#当前服务的名字
spring.application.name=gulimail-coupon
#配置中心的地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#指定使用哪个命名空间
spring.cloud.nacos.config.namespace=c3849876-f08a-48fc-8d08-e7155ec4dc25
#指定使用哪个组的配置文件(不配置的话时候默认组)
spring.cloud.nacos.config.group=dev

 

 

8.一个服务加载多配置集:(将所有配置全部迁移到nacos中)

随着业务不断壮大,一个服务中可能有非常多的配置,不能将所有的配置都写在一个文件中,这样又多又乱,不易维护。需要将其拆分成不同的配置文件:数据源有关的配置写在一个配置中,mybatisplus框架的·配置写在一个配置中,微服务相关的配置写在一个配置中。

 

 

#当前服务的名字
spring.application.name=gulimail-coupon
#配置中心的地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#指定使用哪个命名空间
spring.cloud.nacos.config.namespace=c3849876-f08a-48fc-8d08-e7155ec4dc25
#指定使用哪个组的配置文件(不配置的话时候默认组)
spring.cloud.nacos.config.group=dev

spring.cloud.nacos.config.ext-config[0].data-id=datasouce.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true

spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true

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

Guess you like

Origin blog.csdn.net/kkkkkfffd/article/details/121067121