史上最详细的springcloud alibaba项目搭建以及入门nacos与feign

首先说明,本文章内容是搭建一个基于alibaba的微服务框架,只涉及nacos与feign的使用,不会搭建微服务项目的伙伴们可以来看看。

nacos的安装下载请自行百度,网上教程很多。

我们创建一个父项目,这个父项目下有两个子项目,一个用来注册到nacos,另一个利用feign从nacos中获取数据。

创建父项目

通过maven来创建一个父项目,创建完成后将src目录删除
在这里插入图片描述在这里插入图片描述父 pom.xml 里的内容

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>cloudtest</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>manage-nacos</module>
        <module>manage-nacos-comunser</module>
    </modules>
	
	<!-- 打包方式,必须要-->
    <packaging>pom</packaging>
	<!-- boot依赖,必须要-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.11.RELEASE</version>
        <relativePath/>
    </parent>
	<!-- 定义版本的地方-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.targer>8</maven.compiler.targer>
        <spring-boot-version>2.1.4.RELEASE</spring-boot-version>
        <mysql-connector-version>5.1.47</mysql-connector-version>
        <druid-version>1.1.21</druid-version>
        <mybatis-spring-boot-version>2.1.4</mybatis-spring-boot-version>
        <lombok-version>1.18.8</lombok-version>
        <junit-version>4.12</junit-version>
        <log4j-version>1.2.17</log4j-version>
    </properties>

    <!--   dependencyManagement 是依赖管理,子项目可以从中获取需要的依赖 -->
    <dependencyManagement>
        <dependencies>
            <!--  springcloud alibaba 依赖 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot-version}</version>
            </dependency>
            <!--   数据库依赖 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql-connector-version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid-version}</version>
            </dependency>
            <!--  springboot启动器  -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis-spring-boot-version}</version>
            </dependency>
            <!--   单元测试 依赖 -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit-version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok-version}</version>
                <scope>provided</scope>
            </dependency>
            <!--  日志依赖  -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j-version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>
    </dependencies>
</project>

创建第一个子项目,将这个子项目注册到nacos中

在这里插入图片描述也是通过maven来创建
在这里插入图片描述红框里面刚开始是没有的,需要自己创建
在这里插入图片描述
现在是他的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloudtest</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.guming</groupId>
    <artifactId>manage-nacos</artifactId>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
    	<!--项目启动依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- nacos依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
</project>
  • application.yml文件内容
server:
  port: 8001
spring:
  application:
    name: manage-nacos
  cloud:
    nacos:
      discovery:
        username: nacos
        password: nacos
        server-addr: 127.0.0.1:8848
        namespace: public # 注册到 nacos 的指定 namespace,默认为 public
  • 创建启动类
@SpringBootApplication
public class NacosApplication {
    public static void main(String[] args) {
        SpringApplication.run(NacosApplication.class, args);
    }
}
  • 在controller中定义一个方法,等会feign需要用到
@RestController
public class TestController {

    @PostMapping("/get/name")
    public String getName(String name){
        return "name:"+name;
    }
}
  • 现在启动NacosApplication ,不出意外你打开nacos客户端就会发现里面存在了一个服务

在这里插入图片描述

创建一个用于消费的项目

  • 和前面一个步骤一样,也是用maven来创建
  • 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloudtest</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.guming</groupId>
    <artifactId>manage-nacos-comunser</artifactId>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-cloud-alibaba.version>2.1.2.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- feign 依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
        </dependency>
    </dependencies>
</project>
  • 在启动类添加注解
@SpringBootApplication
@EnableFeignClients //开启feign客户端
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}
  • 创建一个接口来定义需要从哪个服务中获取数据
// 表明这个接口是一个feign客户端,里面的参数表示从哪个服务提供者获取数据
@FeignClient("manage-nacos")
public interface TestFeign {
	服务提供者提供的接口,也就是自己可以通过这个接口获取想要的数据
    @PostMapping("/get/name")
    public String getName(@RequestParam("name") String name);
}
  • 创建controller来消费
@RestController
public class ConsumerController {
    @Autowired
    public TestFeign TestFeign;

    @GetMapping("/test")
    public String getName(){
        String name = TestFeign.getName("我叫王五");
        System.out.println(name);
        return name;
    }
}

在这里插入图片描述

feign原理图

  • 在上面的接口中,我们定义了去哪个服务中获取数据,也就是相当于定义了对应的ip以及端口,后面我们通过@GetMapping("/test") 又定义具体的请求路径,他会在后台自动发送http请求来获取数据。
    在这里插入图片描述
容错机制值得是服务容忍错误的能力,当系统出现网络延迟、网络中断、服务异常等原因,造成当前服务暂时不可用,Dubbo提供了容错机制来优雅地帮助服务调用者处理这类错误。 Dubbo默认提供了6种容错模式 Failover Cluster(默认):失败自动切换。当服务调用失败后,会切换到集群中的其他机器进行重试,默认重试次数为2,通过属性retries=2可以修改次数,但是重试次数增加会带来更长的响应延迟。(这种容错模式通常用于读操作) Failfast Cluster:快速失败。当服务调用失败后,立即报错,也就是指发起一次调用。(这种模式通常用于写操作,这种模式可以防止网络等问题导致数据重复新增,它等同于Failover Cluster retries=0) Failsafe Cluster:失败安全,出现异常时,直接忽略异常。(这种模式处理的数据相对而言不太重要) Failback Cluster:失败后自动回复。服务调用出现异常时,在后台记录这条失败的请求定时重发。(这种模式适合用于消息通知操作,保证这个请求一定发送成功,可以解决短期网络拥塞导致请求的丢失) Forking Cluster:并行调用集群中的多个服务,只要其中一个成功就返回。可以通过forks=2来设置最大并行数。(这种模式要保证请求的幂等性) Broadcast Cluster:广播调用所有的服务提供者,任意一个服务报错则表示服务调用失败。(这种模式需要所有节点都是正常的才能被调用) 服务调用者容错机制的配置方式 容错机制既可以在服务调用者中配置或在服务提供者中配置 在服务调用者中配置只对该调用者起作用(其他调用节点采用默认的) 在服务服务者中配置对所有调用者起作用 调用者的配置优先级高于服务者
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值