SpringCloud Alibaba Nacos注册中心生产消费

为什么使用SpringCloud Alibaba

原因在于spring cloud中的几乎所有的组件都使用Netflix公司的产品,然后在其基础上做了一层封装。然而Netflix的服务发现组件Eureka已经停止更新,而其他的众多组件预计会在明年(即2020年)停止维护。所以急需其他的一些替代产品,也就是spring cloud alibaba,目前正处于蓬勃发展的态式。

Nacos简介

官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.html
我在官网下了个nacos的服务
在这里插入图片描述
你也可以下一个下来跑在Windows本地,启动bin文件夹下的cmd命令文件!
具体其他资料请参考官网
启动成功之后输入:http://localhost:8848/nacos/,用户名密码都是nacos,进入注册中心的控制台.

通过nacos注册生产者

首先创建一个父maven工程,在父工程下创建子模块
在这里插入图片描述
依赖文件

<?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>springcloud-alibaba-learn</artifactId>
        <groupId>com.zhbcm</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-discovery-provider</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-boot.version>2.3.0.RELEASE</spring-boot.version>
        <spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <dependencies>
        <!--spring boot web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--spring-cloud-alibaba nacos服务注册/发现的依赖-->
        <!--格式: spring-cloud-starter-[开源组织机构名字]-[项目模块名字]-->
        <!--spring-cloud-starter-alibaba-sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--spring-boot-starter-actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</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>
            <!-- spring-cloud-dependencies -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!--mybatis代码自动生成插件-->
            <!--<plugin>-->
            <!--    <groupId>org.mybatis.generator</groupId>-->
            <!--    <artifactId>mybatis-generator-maven-plugin</artifactId>-->
            <!--    <version>1.4.0</version>-->
            <!--    <configuration>-->
            <!--        &lt;!&ndash;配置文件的位置&ndash;&gt;-->
            <!--        <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>-->
            <!--        &lt;!&ndash;生成代码过程中是否打印日志&ndash;&gt;-->
            <!--        <verbose>true</verbose>-->
            <!--        &lt;!&ndash;生成时是否覆盖java文件,xml文件总是合并&ndash;&gt;-->
            <!--        <overwrite>true</overwrite>-->
            <!--    </configuration>-->
            <!--</plugin>-->
        </plugins>

        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.*</include>
                </includes>
            </resource>
        </resources>
    </build>
</project>

这里有lombok依赖,所以你的idea里要有lombok插件,如果没有请去idea的插件市场去下

application.propertie配置

#\u5185\u5D4C\u7684web\u670D\u52A1\u5668\u7AEF\u53E3
server.port=8081

#\u670D\u52A1\u540D\u79F0
spring.application.name=nacos-discovery-provider

#nacos\u6CE8\u518C\u4E2D\u5FC3\u7684\u8FDE\u63A5\u5730\u5740
#spring.cloud.nacos.discovery.server-addr=192.168.172.128:8801,192.168.172.128:8802,192.168.172.128:8803
#spring.cloud.nacos.discovery.server-addr=192.168.172.128:80
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

#nacos\u7684\u7528\u6237\u540D\u548C\u5BC6\u7801
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos

#spring boot actuator \u76D1\u63A7\u548C\u5065\u5EB7\u68C0\u67E5\u529F\u80FD
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

#\u670D\u52A1\u96C6\u7FA4\u540D\u79F0
#spring.cloud.nacos.discovery.cluster-name=beijing

#\u670D\u52A1\u7684\u7248\u672C
#spring.cloud.nacos.discovery.metadata.version=v1

#\u670D\u52A1\u63D0\u4F9B\u80051\u662Fdev\u547D\u540D\u7A7A\u95F4
#spring.cloud.nacos.discovery.namespace=b91111e4-8a21-4c12-9a3f-cf40d93a8319
#\u6307\u5B9A\u6CE8\u518C\u65F6\u7684\u670D\u52A1\u5206\u7EC4\uFF0C\u7ECF\u6D4B\u8BD5\u6682\u65F6\u4E0D\u652F\u6301
#spring.cloud.nacos.discovery.group=DEV_GROUP

#\u6307\u5B9Asentinel-dashboard\u63A7\u5236\u53F0\u7684\u8FDE\u63A5\u5730\u5740
#spring.cloud.sentinel.transport.dashboard=192.168.172.128:8080

# 数据库驱动
#spring.datasource.url=jdbc:mysql://39.99.163.122:3306/workdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false
#spring.datasource.username=mysql
#spring.datasource.password=UoT1R8[09/VsfXoO5>6YteB
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

#\u914D\u7F6Ehttps\u7684\u7AEF\u53E3
#server.port=8443
#\u914D\u7F6Ehttps\u7684\u8BC1\u4E66
#server.ssl.key-store=classpath:tomcat.pkcs12
#\u8BC1\u4E66\u7684\u5BC6\u7801\uFF08\u5728\u751F\u6210\u8BC1\u4E66\u7684\u65F6\u5019\u4F1A\u6307\u5B9A\u4E00\u4E2A\u5BC6\u7801\uFF09
#server.ssl.key-store-password=123456
#\u6267\u884C\u8BC1\u4E66\u7684\u7C7B\u578B
#server.ssl.key-store-type=pkcs12

对外提供的接口

package com.zhbcm.nacos.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class EchoController
{
    @GetMapping("/")
    public ResponseEntity index()
    {
        log.info("provider /");
        return new ResponseEntity("index", HttpStatus.OK);
    }

    @GetMapping("/test")
    public ResponseEntity test()
    {
        log.info("provider /test");
        return new ResponseEntity("test", HttpStatus.OK);
    }

    @GetMapping("/sleep")
    public String sleep()
    {
        log.info("provider /sleep");
        try
        {
            Thread.sleep(1000L);
        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        return "ok";
    }

    @GetMapping("/echo/{string}")
    public String echo(@PathVariable String string)
    {
        log.info("provider /echo/{string}");
        return "hello Nacos Discovery " + string;
    }

    @GetMapping("/divide")
    public String divide(@RequestParam Integer a, @RequestParam Integer b)
    {
        log.info("provider /divide");
        return String.valueOf(a / b);
    }

    @GetMapping("/notFound")
    public String notFound()
    {
        System.out.println("provider 1 .........");
        return "notFound";
    }
}

启动类

package com.zhbcm.nacos;

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

@EnableDiscoveryClient //开启服务注册与发现功能: classpath: META-INF/spring.factories文件
@SpringBootApplication
public class Application
{
    public static void main(String[] args)
    {
        SpringApplication.run(Application.class, args);
    }
}

启动成功之后,进入nacos的控制台看有没有服务实例
在这里插入图片描述
服务提供者整合完成

提供消费者

接着创建一个子模块

添加依赖

<?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>springcloud-alibaba-learn</artifactId>
        <groupId>com.zhbcm</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-discovery-consumer</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-boot.version>2.3.0.RELEASE</spring-boot.version>
        <spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <dependencies>
        <!--spring boot web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- springboot官方依赖: spring-boot-starter-xxx-->
        <!-- springboot非官方依赖:xxx-spring-boot-starter-->

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--spring-boot-starter-actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--spring-cloud-starter-openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!--spring-cloud-starter-openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</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.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- spring-cloud-dependencies -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

application.properties

#\u5185\u5D4C\u7684web\u670D\u52A1\u5668\u7AEF\u53E3
server.port=8082

#\u5F53\u524D\u9879\u76EE\u7684\u670D\u52A1\u540D\u79F0
spring.application.name=nacos-discovery-consumer

#nacos\u6CE8\u518C\u4E2D\u5FC3\u96C6\u7FA4\u7684\u8FDE\u63A5\u5730\u5740
#spring.cloud.nacos.discovery.server-addr=192.168.172.128:8801,192.168.172.128:8802,192.168.172.128:8803
#spring.cloud.nacos.discovery.server-addr=192.168.172.128:80
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

#nacos\u7684\u7528\u6237\u540D\u548C\u5BC6\u7801
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos

#spring boot actuator \u76D1\u63A7\u548C\u5065\u5EB7\u68C0\u67E5\u529F\u80FD
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

#\u81EA\u5B9A\u4E49\u914D\u7F6E\uFF0C\u8FDC\u7A0B\u670D\u52A1\u63D0\u4F9B\u8005\u7684\u670D\u52A1\u540D
#service.name=http://29-nacos-discovery-provider

#\u901A\u8FC7\u914D\u7F6E\u6587\u4EF6\u6307\u5B9A\u8D1F\u8F7D\u5747\u8861\u7B56\u7565\uFF0C29-nacos-discovery-provider\u662F\u8FDC\u7A0B\u670D\u52A1\u63D0\u4F9B\u8005\u7684\u540D\u79F0\uFF0C\u4E2A\u6027\u5316\u9700\u6C42\uFF0C\u4E0D\u540C\u670D\u52A1\u91C7\u7528\u4E0D\u540C\u8D1F\u8F7D\u5747\u8861\u7B56\u7565
#29-nacos-discovery-provider.ribbon.NFLoadBalancerRuleClassName=com.bjpowernode.ribbon.MyNacosRule

#29-nacos-discovery-provider2.ribbon.NFLoadBalancerRuleClassName=com.bjpowernode.ribbon.MyNacosRule2

#iping\u7684\u7B56\u7565
29-nacos-discovery-provider.ribbon.NFLoadBalancerPingClassName=com.netflix.loadbalancer.PingUrl
29-nacos-discovery-provider2.ribbon.NFLoadBalancerPingClassName=com.netflix.loadbalancer.PingUrl

#\u6307\u5B9A\u96C6\u7FA4\u7684\u540D\u79F0
#spring.cloud.nacos.discovery.cluster-name=beijing

#\u914D\u7F6E\u670D\u52A1\u7684\u5143\u6570\u636E
spring.cloud.nacos.discovery.metadata.version=v2
spring.cloud.nacos.discovery.metadata.token=123456
spring.cloud.nacos.discovery.metadata.clientId=101

#\u670D\u52A1\u63D0\u4F9B\u80051\u662Fdev\u547D\u540D\u7A7A\u95F4
#spring.cloud.nacos.discovery.namespace=b91111e4-8a21-4c12-9a3f-cf40d93a8319
#\u6307\u5B9A\u6CE8\u518C\u65F6\u7684\u670D\u52A1\u5206\u7EC4\uFF0C\u7ECF\u6D4B\u8BD5\u6682\u65F6\u4E0D\u652F\u6301
#spring.cloud.nacos.discovery.group=DEV_GROUP

#\u5F00\u542F\u9965\u997F\u52A0\u8F7D\uFF0C\u4E00\u542F\u52A8\u5C31\u4ECE\u6CE8\u518C\u4E2D\u5FC3\u83B7\u53D6\u670D\u52A1\u8FDB\u884C\u7F13\u5B58\uFF0C\u9ED8\u8BA4\u662F\u61D2\u52A0\u8F7D
ribbon.eager-load.enabled=true
#\u4E3A\u54EA\u4E9B\u5BA2\u6237\u7AEF\u5F00\u542F\u9965\u997F\u52A0\u8F7D\uFF0C\u591A\u4E2A\u5BA2\u6237\u7AEF\u4F7F\u7528\u9017\u53F7\u5206\u9694\uFF08\u975E\u5FC5\u987B\uFF09
ribbon.eager-load.clients=29-nacos-discovery-consumer

#\u914D\u7F6Efeign\u7684\u8FDE\u63A5\u3001\u8BFB\u53D6\u8D85\u65F6\u65F6\u95F4
#feign.client.config.default.read-timeout=2
#feign.client.config.default.connect-timeout=2
#feign.client.config.default.logger-level=full

#\u914D\u7F6E\u8981\u8C03\u7528\u7684\u67D0\u4E2A\u5177\u4F53\u670D\u52A1\u63D0\u4F9B\u8005\u7684\u8D85\u65F6\u65F6\u95F4
feign.client.config.29-nacos-discovery-provider.read-timeout=5000
feign.client.config.29-nacos-discovery-provider.connect-timeout=5000

#\u914D\u7F6Efeign\u5E95\u5C42\u4F7F\u7528httpclient\u8FDB\u884C\u8FDC\u7A0B\u8C03\u7528\uFF0C\u9ED8\u8BA4feign\u4E5F\u662Fhttpclient
#feign\u7684\u8001\u7248\u672C\uFF0C\u5E95\u5C42\u662F\u91C7\u7528\u7684JDK\u7684httpURLconnection\u53D1\u8D77\u8FDC\u7A0B\u8C03\u7528\uFF0C\u6548\u7387\u4E0D\u5982RestTemplete\uFF0C\u73B0\u5728\u65B0\u7248\u672C\u6548\u7387\u90FD\u5DEE\u4E0D\u591A
feign.httpclient.enabled=true
feign.httpclient.max-connections=200
feign.httpclient.max-connections-per-route=50

#\u6307\u5B9Asentinel-dashboard\u63A7\u5236\u53F0\u7684\u8FDE\u63A5\u5730\u5740
#spring.cloud.sentinel.transport.dashboard=192.168.172.128:8080
#\u6307\u5B9A\u5FAE\u670D\u52A1\u4E0Esentinel-dashboard\u63A7\u5236\u53F0\u7684\u8FDE\u63A5\u7AEF\u53E3
#spring.cloud.sentinel.transport.port=8719

#true\u8868\u793A\u9965\u997F\u52A0\u8F7D
spring.cloud.sentinel.eager=true

#\u5173\u95EDsentinel\u5BF9controller\u7684url\u7684\u4FDD\u62A4
spring.cloud.sentinel.filter.enabled=true

#true\u5F00\u542Fsentinel\u5BF9resttemplate\u7684\u652F\u6301\uFF0Cfalse\u5219\u5173\u95ED
resttemplate.sentinel.enabled=true

#true\u5F00\u542Fsentinel\u5BF9feign\u7684\u652F\u6301\uFF0Cfalse\u5219\u5173\u95ED
feign.sentinel.enabled=true

#\u907F\u514Djava.lang.IllegalStateException: Incompatible fallback instance. Fallback/fallbackFactory of type class com.bjpowernode.service.EchoServiceFallback is not assignable to interface com.bjpowernode.service.FeignService for feign client baidu
spring.main.allow-bean-definition-overriding=true

#\u57FA\u4E8Enacos\u914D\u7F6E\u4E2D\u5FC3\u8FDB\u884C\u89C4\u5219\u6301\u4E45\u5316 (\u5229\u7528nacos\u914D\u7F6E\u4E2D\u5FC3\u6301\u4E45\u5316\u6D41\u63A7\u89C4\u5219)
#spring.cloud.sentinel.datasource.ds1.nacos.server-addr=192.168.172.128:80
#spring.cloud.sentinel.datasource.ds1.nacos.data-id=${spring.application.name}.json
#spring.cloud.sentinel.datasource.ds1.nacos.group-id=DEFAULT_GROUP
#spring.cloud.sentinel.datasource.ds1.nacos.data-type=json
#spring.cloud.sentinel.datasource.ds1.nacos.rule-type=flow

#\u914D\u7F6Ehttps\u7684\u7AEF\u53E3
#server.port=8444
#\u914D\u7F6Ehttps\u7684\u8BC1\u4E66
#server.ssl.key-store=classpath:tomcat.pkcs12
#\u8BC1\u4E66\u7684\u5BC6\u7801\uFF08\u5728\u751F\u6210\u8BC1\u4E66\u7684\u65F6\u5019\u4F1A\u6307\u5B9A\u4E00\u4E2A\u5BC6\u7801\uFF09
#server.ssl.key-store-password=123456
#\u6267\u884C\u8BC1\u4E66\u7684\u7C7B\u578B
#server.ssl.key-store-type=pkcs12

配置远程调用

package com.zhbcm.consumer.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @author 朝花不迟暮
 * @version 1.0
 * @date 2021/3/8 23:13
 */
@Configuration
public class MyRibbonConfig
{
    @Bean
    // @LoadBalanced //负载均衡
    public RestTemplate restTemplate()
    {
        return new RestTemplate();
    }
}

下面还有一个feign调用远程接口的例子
feign调用服务端接口:

package com.zhbcm.consumer.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(name = "nacos-discovery-provider")
public interface EchoFeignService {

    @GetMapping("/echo/hello")
    default String hello() {
        return "hello";
    }

    @GetMapping("/echo/{str}")
    String echo(@PathVariable("str") String str);

    @GetMapping("/divide")
    String divide(@RequestParam("a") Integer a, @RequestParam("b") Integer b);

    /**
     * feign声明的接口可以有默认实现, 就是可以不需要远程服务提供者实现,自己实现了
     *
     * @param a
     * @return
     */
    default String divide(Integer a) {
        System.out.println("consumer devide method......");
        return divide(a, 1);
    }

    // restTemplate.getForObject("http://29-nacos-discovery-provider/sleep", String.class);

    // @FeignClient(name = "29-nacos-discovery-provider")
    // http://29-nacos-discovery-provider/notFound

    // http://192.168.0.104:8081/notFound
    // http://192.168.0.104:8082/notFound

    @GetMapping("/notFound")
    String notFound();
}

控制层

package com.zhbcm.consumer.controller;

import ch.qos.logback.core.util.ContextUtil;
import com.zhbcm.consumer.service.EchoFeignService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import javax.servlet.http.HttpServletRequest;

@RestController
@Slf4j
public class TestController
{

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @Autowired
    private RestTemplate restTemplate;

    //feign 的声明式调用
    @Autowired
    private EchoFeignService echoFeignService;

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/echo/{app}")
    public String echoAppName(@PathVariable("app") String app)
    {
        //使用 LoadBalanceClient 和 RestTemplate 结合的方式来访问
        ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-discovery-provider");

        //  http://192.168.0.104:18082/echo/{app}
        String url = String.format("http://%s:%s/echo/%s", serviceInstance.getHost(), serviceInstance.getPort(), app);
        System.out.println("request url:" + url);

        return restTemplate.getForObject(url, String.class);
    }

    @GetMapping("/echo-rest/{str}")
    public String rest(@PathVariable String str)
    {

        //restTemplate + @LoadBalanced 实现远程调用
        return restTemplate.getForObject("http://29-nacos-discovery-provider/echo/" + str, String.class);
    }

    @GetMapping("/index")
    public String index(HttpServletRequest request) throws Exception
    {
		/*for (int i=0; i<2; i++) {
			String result = restTemplate.getForObject("http://29-nacos-discovery-provider/", String.class);
			System.out.println("调用远程服务结果:" + System.currentTimeMillis() + result);
			//TimeUnit.SECONDS.sleep(1);
		}*/
        System.out.println("X-Request-Id = " + request.getHeader("X-Request-Id"));

        System.out.println("X-Request-red = " + request.getHeader("X-Request-red"));

        System.out.println("color = " + request.getParameter("color"));

        return restTemplate.getForObject("http://29-nacos-discovery-provider/", String.class);
    }

    @GetMapping("/test")
    public String test()
    {
        //try {
        //Thread.sleep(250);
        //int a = 10 / 0;
        /*} catch (Exception e) {
            e.printStackTrace();
			*//*if (!BlockException.isBlockException(e)) {
				Tracer.trace(e);
			}*//*
        }*/
        return restTemplate.getForObject("http://29-nacos-discovery-provider/test", String.class);
    }

    @PostMapping("/test1")
    public String test1()
    {
        //try {
        //Thread.sleep(250);
        //int a = 10 / 0;
        /*} catch (Exception e) {
            e.printStackTrace();
			*//*if (!BlockException.isBlockException(e)) {
				Tracer.trace(e);
			}*//*
        }*/
        return restTemplate.getForObject("http://29-nacos-discovery-provider/test", String.class);
    }

    @GetMapping("/test2/{app}")
    public String test2(@PathVariable("app") String app)
    {
        System.out.println("/test2/{app} --> " + app);
        return restTemplate.getForObject("http://29-nacos-discovery-provider/test", String.class);
    }

    // @GetMapping("/test3/{app}")
    // public String test3(@PathVariable("app") String app) {
    // 	System.out.println("/test3/{app} --> " + app);
    //
    // 	ContextUtil.enter("test3");
    // 	Entry entry = null;
    // 	try {
    // 		entry = SphU.entry("test3");
    //
    // 		//受sentinel保护的代码 start
    // 		int a = 10 / 0;
    // 		return restTemplate.getForObject("http://29-nacos-discovery-provider/test", String.class);
    // 		//受sentinel保护的代码 end
    //
    // 	} catch (BlockException e) {
    // 		e.printStackTrace();
    // 		//手动写上服务降级的代码
    // 		if (e instanceof FlowException) {
    // 			return "限流了...";
    // 		} else if (e instanceof DegradeException) {
    // 			return "熔断降级了...";
    // 		}
    // 		return "熔断了.....";
    // 		//............
    //
    // 	} catch (ArithmeticException e) {
    // 		//对 int a = 10 / 0; 异常的监控
    // 		Tracer.trace(e);
    // 		return "除数不能为0";
    // 	} finally {
    // 		if (entry != null) {
    // 			entry.exit();
    // 		}
    // 		ContextUtil.exit();
    // 	}
    // }
    //
    // @GetMapping("/test4/{app}")
    // @SentinelResource(value = "test4")
    // public String test4(@PathVariable("app") String app) {
    // 	return restTemplate.getForObject("http://29-nacos-discovery-provider/test", String.class);
    // }
    //
    // /**
    //  * blockHandler = "block", blockHandlerClass = MyBlockHandlerClass.class 处理限流和降级
    //  * fallback = "fallback", fallbackClass = MyFallbackClass.class 处理限流和降级
    //  *
    //  * @param a
    //  * @param b
    //  * @return
    //  */
    // @GetMapping("/app") // 埋点:加入sentinel的监控
    // //@SentinelResource(value = "app", fallback = "fallback", fallbackClass = MyFallbackClass.class)
    //
    // @SentinelResource(value = "app", blockHandler = "block", blockHandlerClass = MyBlockHandlerClass.class)
    // public String app(@RequestParam(value = "a", required = false) String a,
    // 				  @RequestParam(value = "b", required = false) String b) {
    // 	System.out.println("/app/--> " + a + "--" + b);
    // 	return restTemplate.getForObject("http://29-nacos-discovery-provider/test", String.class);
    // }

    @GetMapping("/test2")
    public String test2()
    {
        return restTemplate.getForObject("http://29-nacos-discovery-provider/test", String.class);
    }

    @GetMapping("/sleep")
    public String sleep()
    {
        return restTemplate.getForObject("http://29-nacos-discovery-provider/sleep", String.class);
    }

    @GetMapping("/notFound-feign")
    public String notFound()
    {
        return echoFeignService.notFound();
    }

    @GetMapping("/divide-feign")
    public String divide(@RequestParam Integer a, @RequestParam Integer b)
    {
        return echoFeignService.divide(a, b);
    }

    @GetMapping("/divide-feign2")
    public String divide(@RequestParam Integer a)
    {
        return echoFeignService.divide(a);
    }

    @GetMapping("/echo-feign/{str}")
    public String feign(@PathVariable String str)
    {
        log.info("执行方法===echo-feign");
        return echoFeignService.echo(str);
    }

    @GetMapping("/services/{service}")
    public Object client(@PathVariable String service)
    {
        return discoveryClient.getInstances(service);
    }

    @GetMapping("/services")
    public Object services()
    {
        System.out.println(discoveryClient.description());
        System.out.println(discoveryClient.getOrder());
        return discoveryClient.getServices();
    }
}

== 例子后面会精简下==
启动类

package com.zhbcm.consumer;

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

@EnableFeignClients //开启feign
@EnableDiscoveryClient //开启nacos服务注册与发现
@SpringBootApplication
public class Application
{
    public static void main(String[] args)
    {
        SpringApplication.run(Application.class, args);
    }
}

上面都是些基本的代码,写过springcloud的入门级代码的朋友都可以轻松吸收!

测试
在这里插入图片描述

问题

最后在测试,通过restTemplate调用远程接口的时候报错
在这里插入图片描述
这个问题百度一下就出来了,配置restTemplate的时候,配置了负载均衡,他会自动找应用名
在这里插入图片描述
所以
在这里插入图片描述
码云链接: https://gitee.com/thirtyleo/springcloud-alibaba-learning.git

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值