springcloud学习 feign与nacos的使用

公司使用Feig+Nacos作为微服务架构,之前没有学习过,最近学习了一下踩了很多坑,记录一下

服务提供者的代码放在github上了,有需要的可以参考。
github地址
首先Nacos是阿里开源的注册中心与配置中心,具体的学习与安装可以查看官方文档,Nacos官方中文文档
Fegin是一种Springcloud提供的服务调用的实现,具体学习可以查看官网或者中文社区

这里只有入门实现,没有原理,想看原理的朋友可以跳了

服务提供者

父工程

pom依赖
这里有第一个坑,springboot与springcloud有版本对应关系,不能乱用,具体对应关系可以 官网介绍

<properties>
        <maven.compiler.source>8maven.compiler.source>
        <maven.compiler.target>8maven.compiler.target>
        <revision>1.0.0-SNAPSHOTrevision>
        <spring-cloud.version>2021.0.1spring-cloud.version>
        <spring.boot.version>2.6.6spring.boot.version>
        <lombok.version>1.18.22lombok.version>
        <nacos.version>2021.1nacos.version>
    properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-dependenciesartifactId>
                <version>${spring.boot.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
                <version>${lombok.version}version>
            dependency>
            <dependency>
                <groupId>com.fancygroupId>
                <artifactId>SpringCloud-feignartifactId>
                <version>${revision}version>
            dependency>
            <dependency>
                <groupId>com.fancygroupId>
                <artifactId>SpringCloud-feign-implartifactId>
                <version>${revision}version>
            dependency>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
                <version>${nacos.version}version>
            dependency>
        dependencies>
    dependencyManagement>

API定义工程

接口定义module,这个module专门用来定义feign,方便提供者与消费者引用。
pom依赖

	<dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-openfeignartifactId>
        dependency>
    dependencies>

定义一个feign接口,需要注意name不能乱写,feign在进行调用时如果我们没有指定url会根据注册中心通过这个name获取提供服务的机器进行负载均衡然后调用,这个name应该就是提供服务的服务名
springcloud学习 feign与nacos的使用_第1张图片
由于我们定义出来的feign当别人引入时,如果这样写是加载不到spring容器中的,我们不应该让引用我们服务的人自己去手动扫描这个包,可以使用springboot的机制来自己加载我们想要加载的类
添加配置文件spring.factories放字资源目录META-INF下
springcloud学习 feign与nacos的使用_第2张图片
写一个配置类去帮引用我们服务的人加载我们的服务
springcloud学习 feign与nacos的使用_第3张图片
feign定义层就写完了,feign的入参出参应该也定义在这个module中。

业务逻辑工程

		<dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-loadbalancerartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency> // 这个是我们自己的jar 写的名字不太规范
            <groupId>com.fancygroupId>
            <artifactId>SpringCloud-feignartifactId>
        dependency>

启动类上写个注解将自己注册到Nacos即可
@EnableDiscoveryClient
写一个实现feign接口的具体逻辑层,

  • 注意一定要将它交给spring管理,如果不给spring管理找不到这个类,那么会认为服务没有实现,返回的结果一直是null
  • 并且我们定义的这User类一定要有空构造方法!

springcloud学习 feign与nacos的使用_第4张图片
yml

server:
  port: 8081
spring:
  application:
    name: feign-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

服务提供者就写完啦

服务消费者

这个我们就建一个简单的module就行

<properties>
        <java.version>1.8java.version>
        <spring-cloud.version>2021.0.1spring-cloud.version>
        <nacos.version>2021.1nacos.version>
    properties>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            <version>${nacos.version}version>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-openfeignartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-loadbalancerartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-devtoolsartifactId>
            <scope>runtimescope>
            <optional>trueoptional>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <optional>trueoptional>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
        <dependency> // 引入我们定义的api包  注意需要将这个包install一下 下载到我们本地仓库
            <groupId>com.fancygroupId>
            <artifactId>SpringCloud-feignartifactId>
            <version>1.0.0-SNAPSHOTversion>
        dependency>
    dependencies>


    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

启动类上加个注解将自己注册到Nacos上
@EnableDiscoveryClient

写个测试类springcloud学习 feign与nacos的使用_第5张图片
yml

server:
  port: 8082
spring:
  application:
    name: feign-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

然后就搞定啦 调用下即可
由于我们在API定义层已经完成了feign的扫描操作,所以在提供者消费者都不需要在启动类上加注解
@EnableFeignClients 加了反而会报错哦

你可能感兴趣的:(分布式,spring,cloud,spring,java)