SpringCloudAlibaba微服务

SpringCloudAlibaba微服务

1.构建Nacos服务

(1)下载并安装Nacos

下载链接:

github.com/alibaba/nac…

选择1.4.1版本进行下载 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M3ufYviU-1622644451127)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622547399803.png)]

解压Nacos到一个没有中文和空格的目录,结构目录如下 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LTlZKOqz-1622644451134)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622547493646.png)]

(2)初始化配置

第一步:找到/conf/nacos-mysql.sql文件里的sql脚本,然后登陆mysql,然后基于脚本文件中的描述创建数据库(名字nacos_config,编码方式utf8mb4),并执行脚本文件,脚本执行成功会创建一些表,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d3u4g1mI-1622644451137)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622547726431.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7REgdZDa-1622644451140)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622547889449.png)] 第二步:打开/conf/application.properties里打开默认配置,并基于你当前环境配置要连接的数据库,连接数据库时使用的用户名和密码: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GK7IAV2a-1622644451142)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622547944933.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5bS3wCjt-1622644451144)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622547990781.png)]

修改配置文件的内容

### If use MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root
复制代码

(3)服务启动和访问

第一步:启动Nacos服务

Linux/Unix/Mac启动命令(standalone代表着单机模式运行,非集群模式):

sh startup.sh -m standalone
复制代码

Windows启动命令(standalone代表着单机模式运行,非集群模式):

startup.cmd -m standalone
复制代码

第二步:访问Nacos服务。

打开浏览器,输入

http://localhost:8848/nacos
复制代码

地址,出现如下登陆页面:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wk3Nq9Lc-1622644451144)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622548217636.png)] 其中,默认账户和密码都是

nacos
复制代码

2.服务注册与调用入门

​ 创建两个项目Module分别为服务提供者和服务消费者,两者都要注册到NacosServer中(这个server本质上就是一个web服务,端口默认为8848),然后服务提供者可以为服务消费者提供远端调用服务(例如支付服务为服务提供方,订单服务为服务消费方),如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UXUlS9KB-1622644451145)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622548411180.png)]

创建父级工程

(1)创建空项目

第一步:创建空项目(Empty Project,空项目可以看成是一个工作区),要求项目所在路径不能有中文目录(项目创建完以后,需要对项目进行初始配置,例如maven构建环境,编译环境,工作区编码等),如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p8bL8If6-1622644451145)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622548560503.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WDA3sT7j-1622644451146)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622548685591.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fm2cO4n2-1622644451146)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622548730770.png)] 点击“ok”以后可能项目目录没有加载进来,关闭项目重新打开就可以了。

配置项目的maven和编码,maven使用3.3.x或者更高,编码使用utf-8

file->settings [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fyupiU2t-1622644451147)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622549015623.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F7D0wJJ4-1622644451147)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622549070711.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TLCMVd6t-1622644451148)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622549154983.png)]

(2)创建maven父工程

创建maven module工程01-sca,此工程为我们后续项目模块的父工程,这个工程的作用就是来管理子模块中所需要的共性依赖,如图所示:

选中空项目,新建module [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wk07S9Gp-1622644451148)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622558251720.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OAEXqY0e-1622644451149)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622558315537.png)]

(3)添加依赖

springboot的版本使用的是2.3.2.RELEASE

01-sca的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>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
    </parent>

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.cy</groupId>
    <artifactId>01-sca </artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>sca-nacos-provider</module>
    </modules>

    <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-version>Hoxton.SR8</spring.cloud-version>
        <spring.cloud.alibaba-version>2.2.5.RELEASE</spring.cloud.alibaba-version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>
        </dependencies>
    </dependencyManagement>
</project>
复制代码

其中的版本可参考如下网址(涉及到一个兼容性问题,不能随意指定其版本):

github.com/alibaba/spr…

说明:父工程资源初始化完成以后,将src目录删除,因为父工程只负责依赖管理.

创建生产者

(1)新建module

创建服务提供者继承parent工程(01-msa),module名为sca-nacos-provider(创建module工程时在父工程上右键创建module)。选中01-sca项目,右键新建module,选择maven工程。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oNlqAd02-1622644451150)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622559279714.png)]

(2)添加项目依赖

关键代码如下:

<parent>
    <groupId>com.cy</groupId>
    <artifactId>01-sca</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

<dependencies>

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

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>
复制代码

(3)修改application.yml配置

创建并修改配置文件application.yml(或者application.properties),实现服务注册,关键代码如下:

server:
   port: 8081
spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      server-addr: localhost:8848
复制代码

注意:服务名不要使用下划线(“_”),应使用横杠(“-”),这是规则。

(4)创建启动类

并定义处理请求的控制层对象和方法,关键代码如下:

package com.cy;

@SpringBootApplication
public class NacosProviderApplication {

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

	@Value("${server.port}")
	private String server;

    @RestController
    public class ProviderController {
        @GetMapping(value = "/provider/echo/{string}")
        public String doEcho(@PathVariable String string) {
            return server+"say:Hello Nacos Discovery " + string;
        }
    }
}
复制代码

(5)启动

启动启动类,然后刷先nacos服务,检测是否服务注册成功,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-krqLFayg-1622644451150)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622632575289.png)]

创建消费者

(1)新建module名为sca-nacos-consumer

选中01-sca时右键新建module [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZWDL9Jfg-1622644451150)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622633008080.png)]

(2)添加依赖

sca-nacos-consumer的pom.xml文件

	<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
复制代码

(3)修改配置文件

修改application.yml的配置文件

server:
  port: 8090
spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #从哪里去查找服务
复制代码

(4)创建启动类

创建启动类并实现服务消费,关键代码如下:

package com.cy;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class NacosConsumerApplication {

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

    @Bean
    @LoadBalanced   //注解描述RestTemplate对象时,表示让restTemplate具备了负载均衡的特性
    public RestTemplate loadBalancedRestTemplate(){ //bean的名字默认为方法名
        return new RestTemplate();
    }

    @Value("${spring.application.name}")
    private String appName;

    @RestController
    public class ConsumerController{

        @Autowired
        private RestTemplate restTemplate;

        @Autowired
        private RestTemplate loadBalancedRestTemplate;

        @Autowired
        private LoadBalancerClient loadBalancerClient;

        /**
         * 使用loadBalancerClient
         * 使用restTemplate进行远程调用
         * @return
         */
        @GetMapping("/consumer/doRestEcho1")
        public String doRestEcho(){
            ServiceInstance serviceInstance =
                    loadBalancerClient.choose("nacos-provider");
            String url = "http://localhost:8081/provider/echo/"+appName;
            System.out.println("request url:"+url);
            return restTemplate.getForObject(url, String.class);
        }

        @GetMapping("/consumer/doRestEcho02")
        public String doRestLoadBalancerClientEcho(){
            ServiceInstance serviceInstance =
                    loadBalancerClient.choose("nacos-provider");
            String url = String.format("http://%s:%s/provider/echo/%s",
                    serviceInstance.getHost(),
                    serviceInstance.getPort(),
                    appName);
            System.out.println("request url:"+url);
            return restTemplate.getForObject(url, String.class);
        }

        @GetMapping("/consumer/doRestEcho3")
        public String doLoadBalanceRestTemplateEcho(){
            String url=String.format("http://nacos-provider/provider/echo/%s",appName);
            //向服务提供方发起http请求,获取响应数据
            return loadBalancedRestTemplate.getForObject(
                    url,//要请求的服务的地址
                    String.class);//String.class为请求服务的响应结果类型
        }

    }
}
复制代码

(5)启动消费者服务

启动消费者服务,并在浏览器输入http://localhost:8090/consumer/doRestEcho1地址进行访问,假如访问成功会出现,如图所示效果: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pAUvoUzS-1622644451151)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622634001447.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1rEx9CSC-1622644451152)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622634042758.png)]

服务负载均衡设计及实现

一个服务实例可以处理请求是有限的,假如服务实例的并发访问比较大,我们会启动多个服务实例,让这些服务实例采用一定策略均衡(轮询,权重,随机,hash等)的处理并发请求,在Nacos中服务的负载均衡(Nacos客户端负载均衡)是如何应用的?

(1)注入LoadBalancerClient

第一步:修改ConsumerController类,注入LoadBalancerClient对象,并添加doRestLoadBalancerClientEcho方法,然后进行服务访问。修改消费者

		@Autowired
        private LoadBalancerClient loadBalancerClient;
   
        @GetMapping("/consumer/doRestEcho02")
        public String doRestLoadBalancerClientEcho(){
            ServiceInstance serviceInstance = 
loadBalancerClient.choose("nacos-provider");
            String url = String.format("http://%s:%s/provider/echo/%s",
serviceInstance.getHost(),
serviceInstance.getPort(),
appName);
            System.out.println("request url:"+url);
           return restTemplate.getForObject(url, String.class);
        }
复制代码

(2)增加生产者

打开Idea服务启动配置,如图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZcUMo1o8-1622644451152)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622634600420.png)] 修改并发运行选项(假如没有找到这个选项我们需要通过搜索引擎基于组合查询的方法,去找到对应的解决方案,例如搜索 idea allow parallel run),如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-APaM10CN-1622644451153)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622634629557.png)] IDEA2020 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CuGqCO1O-1622644451153)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622634762816.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mx0u4n0R-1622644451154)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622634846109.png)]

(3)不同端口启动消费者

修改nacos-provider的配置文件端口,分别以8081,8082端口方式进行启动。

server:
  port: 8081
spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      server-addr: localhost:8848
复制代码

启动成功以后,访问nacos的服务列表,检测服务是否成功注册,如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UHQYm10o-1622644451154)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622634941358.png)]

(4)访问

打开浏览器,输入

http://localhost:8090/consumer/doRestEcho02
复制代码

进行访问,发现每次消费的是不同的生产者。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R93MaXQp-1622644451155)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622635056868.png)]

这里多个实例并发提供服务的方式为负载均衡,这里的负载均衡实现默认是因为Nacos集成了Ribbon来实现的,Ribbon配合RestTemplate,可以非常容易的实现服务之间的访问。Ribbon是Spring Cloud核心组件之一,它提供的最重要的功能就是客户端的负载均衡(客户端可以采用一定算法,例如轮询访问,访问服务端实例信息),这个功能可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡方式的服务调用。

@LoadBalanced的使用

当使用RestTemplate进行远程服务调用时,假如需要负载均衡,可以在RestTemplate对象构建时,使用@LoadBalanced对构建RestTemplate的方法进行修饰,例如在NacosConsumerApplication中构建RestTemplate对象:

@Bean
@LoadBalanced
public RestTemplate loadBalancedRestTemplate(){
    return new RestTemplate();
}
复制代码

在需要RestTemplate实现负载均衡调用的地方进行依赖注入.例如在ConsumerController类中添加loadBalancedRestTemplate属性。

@Autowired
private RestTemplate loadBalancedRestTemplate;
复制代码

接下来,可以在对应的服务端调用方的方法内,基于RestTemplate借助服务名进行服务调用, 例如:

@GetMapping("/consumer/doRestEcho3")
public String doLoadBalanceRestTemplateEcho(){
    String url=String.format("http://nacos-provider/provider/echo/%s",appName);
    //向服务提供方发起http请求,获取响应数据
    return loadBalancedRestTemplate.getForObject(
            url,//要请求的服务的地址
            String.class);//String.class为请求服务的响应结果类型
}
复制代码

RestTemplate在发送请求的时候会被LoadBalancerInterceptor拦截,它的作用就是用于RestTemplate的负载均衡,LoadBalancerInterceptor将负载均衡的核心逻辑交给了loadBalancer,核心代码如下所示

public ClientHttpResponse intercept(final HttpRequest request, 
final byte[] body,
		              final ClientHttpRequestExecution execution) 
throws IOException {
	final URI originalUri = request.getURI();
	String serviceName = originalUri.getHost();
	return this.loadBalancer.execute(serviceName, 
requestFactory.createRequest(request, body, execution));
}
复制代码

@LoadBalanced注解是属于Spring,而不是Ribbon的,Spring在初始化容器的时候,如果检测到Bean被@LoadBalanced注解,Spring会为其设置LoadBalancerInterceptor的拦截器。

Ribbon负载均衡策略

基于Ribbon方式的负载均衡,Netflix默认提供了七种负载均衡策略,对于SpringCloud Alibaba解决方案中又提供了NacosRule策略,默认的负载均衡策略是轮训策略。如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6CfiAagL-1622644451155)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622636359753.png)] 当系统提供的负载均衡策略不能满足我们需求时,我们还可以基于IRule接口自己定义策略.

RestTemplate 应用分析

RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求等。RestTemplate 继承自 InterceptingHttpAccessor 并且实现了 RestOperations 接口,其中 RestOperations 接口定义了基本的 RESTful 操作,这些操作在 RestTemplate 中都得到了具体实现。

在微服务接口设计时,大部分接口都满足 RESTful 风格,使用 RestTemplate 则可以非常方便地发送 RESTful 风格的请求。

相关方法

RestTemplate 可以看到有很多方法,我们可以提取出主要的几种方法是:

  • GET
  • POST
  • PUT
  • DELETE
  • HEAD
  • OPTIONS
  • EXCHANGE
  • EXECUTE
  • …..

Get方法应用

常见Get方法如图所示(在idea中可以ctrl+f12进行查看): [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ye6qV1c-1622644451156)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622636553052.png)] Post方法应用

常见post方法如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZtQJ8a2V-1622644451156)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622636577204.png)] Put方法应用

常见put方法如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J56dDkWC-1622644451157)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622636606507.png)]

Delete方法应用

常见Delete方法如图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J4UIvH2b-1622644451157)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622636625722.png)]

应用案例分析

通过案例分析RestTemplate类中相关方法的应用。

(1)服务提供者构建类和方法

第一步:在服务提供方sca-nacos-provider,构建类及方法,代码如下:

package com.cy;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import java.util.Map;

/**通过此案例演示rest请求的处理*/
@RestController
@RequestMapping("/provider/template/")
public class RestProviderController {
    @Value("${server.port}")
    private String server;

    @DeleteMapping("{id}")
    public void doDelete(@PathVariable Integer id){
        System.out.println(id+" is delete by "+server);
        // throw new RuntimeException("delete error");
    }

    @PostMapping
    public Map<String,Object> doPost(
            @RequestBody Map<String,Object> map){
        System.out.println("consumer post data: "+map);
        map.put("status", 1);
        map.put("server.port", server);
        return map;
    }

    @PutMapping
    public void doPut(@RequestBody Map<String,Object> map){
        System.out.println("consumer put data: "+map);
    }
}
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IdVUZZUR-1622644451157)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622637556301.png)]

(2)服务的消费方构建类和方法

第二步:在服务消费方sca-nacos-consumer,定义类及方法,关键代码如下:

package com.cy;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import java.util.Map;

@RestController
@RequestMapping("/consumer/template/")
public class RestConsumerController {
    @Autowired
    private RestTemplate loadBalancedRestTemplate;

    @DeleteMapping("{id}")
    public String doDelete(@PathVariable Integer id){
        String url=String.format("http://%s/provider/template/%s",
                "nacos-provider",id);
        loadBalancedRestTemplate.delete(url);
        return "delete ok";
    }

    @PostMapping
    public Map<String,Object> doPost(
            @RequestBody Map<String,Object> map){
        //定义服务提供方的url
        String url=String.format("http://%s/provider/template/",
                "nacos-provider");
        return loadBalancedRestTemplate.postForObject(url,
                map,//这里map表示要提交到服务提供方的数据
                Map.class//这个类型通常对应响应结果类型
        );
    }

    @PutMapping
    public String doPut(@RequestBody Map<String,Object> map){
        //定义服务提供方的url
        String url=String.format("http://%s/provider/template/",
                "nacos-provider");
        loadBalancedRestTemplate.put(url, map);//这里map表示要提交到服务提供方的数据
        return "put ok";
    }

}
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HZUBcsnU-1622644451158)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622637637839.png)]

Delete请求测试,如图所示。

http://localhost:8090/consumer/template/15
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q9vXOGmS-1622644451158)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622642844700.png)]

POST请求测试

http://localhost:8090/consumer/template/

json

{
    "id":1000,
    "name":"tony",
    "age":18
}
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oYAOjeHu-1622644451159)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622643036802.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5kFrbuYX-1622644451159)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622642938547.png)]

put请求测试

http://localhost:8090/consumer/template/

json

{
    "id":1000,
    "name":"tony",
    "age":18
}
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TWyynesS-1622644451160)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622643036802.png)]

基于Feign的远程服务调用

feign应用实战

(1)添加依赖

在服务消费方,添加项目依赖(SpringCloud团队基于OpenFeign研发了starter),代码如下:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
复制代码

(2)添加注解

在启动类上添加@EnableFeignClients注解

@EnableFeignClients
@SpringBootApplication
public class NacosConsumerApplication {…}
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ou2yVe7f-1622644451161)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622643391760.png)]

(3)新建接口定义请求API

@FeignClient(name = "nacos-provider")
@RestController
public interface ConsumerHttpApi {

    @GetMapping("/provider/echo/{string}")
    public String echoMessage(@PathVariable("string") String string);
    
}
复制代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ZOIrxSx-1622644451163)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622643640683.png)] 其中,@FeignClient描述的接口底层会为其创建实现类。

(4)添加feign访问

在FeignConsumerController中添加feign访问

@RestController
@RequestMapping("/consumer/feign/")
public class FeignConsumerController {

    @Value("${spring.application.name}")
    private String appName;

    @Autowired
    private ConsumerHttpApi consumerHttpApi;
    /**基于feign方式的服务调用*/
    @GetMapping
    public String doFeignEcho(){
        return consumerHttpApi.echoMessage(appName);
    }
}
复制代码

(5)通过feign访问

启动消费者服务,在浏览器中直接通过feign客户端进行访问,如图所示(反复刷新检测其响应结果): [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6zb8KN8w-1622644451164)(C:\Users\沉思\AppData\Roaming\Typora\typora-user-images\1622644312298.png)]

Feign配置增强分析

feign.client.config.default.read-timeout=1
feign.client.config.default.connect-timeout=1
feign.client.config.nacos-provider.read-timeout=1
复制代码

猜你喜欢

转载自juejin.im/post/7031187683380559879