WordPress手机站插件,用python怎么做网站,新版织梦腾讯3366小游戏门户网站模板源码,学广告设计要学多久目录 引出微服务之间的调用几种调用方法spring提供的组件 RestTemplate的使用导入依赖生产者模块单个配置的情况多个配置的情况没加.yaml的报错【报错】两个同名配置【细节】 完整代码config配置主启动类controller层 消费者模块进行配置restTemplate配置类controller层 使用na… 目录 引出微服务之间的调用几种调用方法spring提供的组件 RestTemplate的使用导入依赖生产者模块单个配置的情况多个配置的情况没加.yaml的报错【报错】两个同名配置【细节】 完整代码config配置主启动类controller层 消费者模块进行配置restTemplate配置类controller层 使用nacos的服务名【报错】添加Ribbon负载均衡改造configcontroller调用 总结 引出 1.微服务调用的几种方式异步消息传递http调用服务网关调用服务发现调用nacos 2.spring提供的restTemplate发送HTTP请求的客户端工具类 3.nacos使用服务名报错需要加Ribbon负载均衡
微服务之间的调用 几种调用方法 RPCRemote Procedure Call远程过程调用协议一种通过网络从远程计算机上请求服务而不需要了解底层网络技术的协议。RPC它假定某些协议的存在例如TPC/UDP等为通信程序之间携带信息数据。在OSI网络七层模型中RPC跨越了传输层和应用层RPC使得开发包括网络分布式多程序在内的应用程序更加容易。 微服务之间的调用可以有以下几种方式
同步HTTP调用微服务可以通过HTTP协议进行同步调用。一个微服务可以发送HTTP请求到另一个微服务的API接口并等待响应。这种方式简单直接适用于简单的请求和响应场景。异步消息传递微服务可以通过消息队列或消息中间件进行异步消息传递。一个微服务可以将消息发送到消息队列另一个微服务可以从队列中接收并处理消息。这种方式可以实现解耦和异步处理适用于高并发和异步场景。RPC调用微服务可以使用远程过程调用RPC框架进行调用。RPC框架可以隐藏底层通信细节使得微服务之间的调用像本地方法调用一样简单。常见的RPC框架有gRPC、Dubbo等。服务网关调用微服务可以通过服务网关进行调用。服务网关作为微服务的入口可以对外提供统一的API接口并将请求转发给相应的微服务。服务网关可以实现负载均衡、安全认证等功能。服务发现调用微服务可以通过服务发现机制进行调用。微服务注册到服务注册中心其他微服务可以通过服务注册中心获取到服务的地址和端口并进行调用。常见的服务发现工具有Consul、Eureka等。Nacos全称为Naming and Configuration Service是一个开源的动态服务发现、配置管理和服务管理平台。它由阿里巴巴集团开发并开源旨在帮助开发者更好地构建和管理微服务架构。
spring提供的组件
RestTemplateRibbonRestTemplateOpenFeign
RestTemplate是Spring Framework提供的一个用于发送HTTP请求的客户端工具类。它简化了在Java应用程序中进行HTTP通信的过程封装了底层的HTTP连接和请求/响应处理逻辑。
RestTemplate的主要特点和功能包括
支持多种HTTP方法RestTemplate支持常见的HTTP方法如GET、POST、PUT、DELETE等可以根据需要选择合适的方法来发送请求。提供丰富的请求和响应处理方法RestTemplate提供了多种方法来处理请求和响应如添加请求头、设置请求参数、发送请求、获取响应等。开发者可以根据需要选择合适的方法来处理HTTP请求和响应。支持请求和响应的序列化和反序列化RestTemplate可以将请求和响应的数据进行序列化和反序列化支持多种数据格式如JSON、XML等。开发者可以根据需要选择合适的序列化和反序列化方式。支持错误处理和异常处理RestTemplate可以处理HTTP请求过程中的错误和异常如连接超时、请求失败等。开发者可以根据需要进行错误处理和异常处理。可扩展性和定制化RestTemplate提供了一些扩展点和配置选项可以进行定制化配置。开发者可以根据需要进行扩展和定制以满足特定的业务需求。
总之RestTemplate是一个方便易用的HTTP客户端工具类可以在Java应用程序中发送HTTP请求并处理响应。它是Spring Framework的一部分与Spring的其他组件集成良好如Spring Boot、Spring Cloud等。然而从Spring 5.0版本开始官方推荐使用WebClient来替代RestTemplate因为WebClient提供了更强大和灵活的功能。
Ribbon是Netflix开源的一个负载均衡器它是Spring Cloud中的一个组件用于在微服务架构中实现客户端的负载均衡。Ribbon可以将客户端请求均匀地分发到多个服务实例上以提高系统的可用性和性能。
Ribbon的主要特点和功能包括
客户端负载均衡Ribbon可以根据配置的负载均衡策略将客户端请求分发到多个服务实例上。它支持多种负载均衡算法如轮询、随机、加权轮询等。服务发现和注册Ribbon集成了服务注册中心可以自动发现和获取可用的服务实例。它可以与Eureka、Consul等服务注册中心进行集成。故障转移和容错Ribbon可以检测服务实例的健康状态并在服务不可用时自动切换到其他可用的实例。它还支持熔断机制可以在服务出现故障时进行快速失败避免级联故障。定制化配置Ribbon提供了丰富的配置选项可以根据需要进行定制化配置。开发者可以配置负载均衡策略、超时时间、重试次数等参数。与Spring Cloud集成Ribbon与Spring Cloud的其他组件集成良好如Eureka、Feign等。它可以作为Feign的默认负载均衡器实现服务间的调用和负载均衡。
总之Ribbon是一个强大的负载均衡器可以在微服务架构中实现客户端的负载均衡。它与Spring Cloud的其他组件紧密结合为构建和管理微服务架构提供了重要的支持。
OpenFeign是一个声明式的Web服务客户端它是Spring Cloud中的一个组件用于简化和优化微服务架构中的服务间调用。OpenFeign基于Netflix的Feign库进行了扩展和增强。
OpenFeign的主要特点和功能包括
声明式的API定义通过使用注解开发者可以定义和描述服务间的API接口包括请求方法、路径、参数、请求头等信息。这样可以使得服务间的调用代码更加简洁和易于维护。自动化的服务发现和负载均衡OpenFeign集成了服务注册中心可以自动发现和调用其他微服务。它还支持负载均衡可以根据配置的负载均衡策略选择合适的服务实例进行调用。内置的请求和响应拦截器OpenFeign提供了一些内置的拦截器可以在请求和响应的不同阶段进行拦截和处理。开发者可以自定义拦截器来实现日志记录、错误处理等功能。支持多种编码器和解码器OpenFeign支持多种编码器和解码器可以处理不同的数据格式如JSON、XML等。开发者可以根据需要选择合适的编码器和解码器。整合了Hystrix和RibbonOpenFeign与Hystrix和Ribbon等其他Spring Cloud组件集成可以实现服务的容错和熔断机制提高系统的可靠性和稳定性。
总之OpenFeign简化了微服务架构中的服务间调用提供了一种简洁、声明式的方式来定义和调用服务API。它与Spring Cloud的其他组件集成良好是构建和管理微服务架构的重要工具之一。
RestTemplate的使用 微服务之间的调用 生产者(被使用者) —provider 消费者(应用的服务) — consumer 将两个服务注册到nacos 导入依赖 ?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.tianju/groupIdartifactIdspringcloud-restTemplate/artifactIdversion1.0-SNAPSHOT/versionpackagingpom/packagingmodulesmodulespringcloud-consumer/modulemodulespringcloud-provider/module/modulespropertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.targetproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.6.13/version/parent!-- 依赖的管理--dependencyManagementdependencies!--整合springcloud --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion2021.0.5/versiontypepom/typescopeimport/scope/dependency!--整合springcloud alibaba--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion2021.0.5.0/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency!-- 为了让别人发现--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency
!-- 注册配置--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-bootstrap/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency/dependencies/project生产者模块 单个配置的情况 spring:cloud:nacos:discovery:# 能够注册register-enabled: trueserver-addr: http://192.168.111.130:8848/config:server-addr: ${spring.cloud.nacos.discovery.server-addr}# namespace的idnamespace: 57bca93f-1161-4649-aec3-da79c3aa7cc2# # 配置单个group: DEVname: book-cofigfile-extension: yamlapplication:name: springCloud-provider多个配置的情况 没加.yaml的报错【报错】
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘providerController’: Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder ‘book.name’ in value “${book.name}”
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder ‘book.name’ in value “${book.name}” 两个同名配置【细节】 完整代码 config配置 bootstrap.yml spring:cloud:nacos:discovery:# 能够注册register-enabled: trueserver-addr: http://192.168.111.130:8848/config:server-addr: ${spring.cloud.nacos.discovery.server-addr}# namespace的idnamespace: 57bca93f-1161-4649-aec3-da79c3aa7cc2# # 配置单个
# group: DEV
# name: book-cofig
# file-extension: yaml# 配置多个 TODO:配置多个的时候要加上.yaml后缀nacos中的命名也要加.yaml# TODO:如果两个配置里面的值相同则后面加载进来的会覆盖前面的extension-configs:
# - data-id: book-cofig
# group: DEV
# refresh: true- data-id: book-config1.yamlgroup: DEVrefresh: true- data-id: book-config2.yamlgroup: DEVrefresh: trueapplication:name: springCloud-providerapplication.yml server:port: 9099主启动类
package com.tianju.cloud.provider;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;SpringBootApplication
EnableDiscoveryClient
public class ProviderApp {public static void main(String[] args) {SpringApplication.run(ProviderApp.class, args);}
}
controller层
package com.tianju.cloud.provider.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;RestController
RequestMapping(/api/provider)
public class ProviderController {Value(${book.name})private String movieName;Value(${spring.application.name})private String serverId;Value(${server.port})private int port;GetMapping(/hello)public String hello(){String s 服务serverId,端口port,电影名movieName;System.out.println(s);return s;}
}
消费者模块 进行配置 spring:cloud:nacos:discovery:# 能够注册register-enabled: trueserver-addr: http://192.168.111.130:8848/application:name: springCloud-consumerrestTemplate配置类
package com.tianju.consumer.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;Configuration
public class RestTemplateConfig {Bean(name restTemplateA) // 定义名称public RestTemplate restTemplate(){return new RestTemplate();}
}controller层
package com.tianju.consumer.controller;import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;RestController
RequestMapping(/api/consumer)
public class ConsumerController {Resource // 根据名称注入private RestTemplate restTemplateA;GetMapping(/nihao)public String nihao(){String url http://localhost:9099/api/provider/hello;ResponseEntityString forEntity restTemplateA.getForEntity(url,String.class);String body forEntity.getBody();System.out.println(消费者获取生产者提供的数据body);return body;}}
使用nacos的服务名【报错】 添加Ribbon负载均衡 !--客户端负载均衡loadbalancer--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId/dependency改造config
package com.tianju.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;Configuration
public class RestTemplateConfig {Bean(name restTemplateA) // 定义名称public RestTemplate restTemplate(){return new RestTemplate();}LoadBalanced // 具有软件负载均衡能力Bean(name restTemplateWith) // 定义名称public RestTemplate restTemplateWith(){return new RestTemplate();}
}controller调用
package com.tianju.consumer.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;RestController
RequestMapping(/api/consumer)
public class ConsumerController {Resource // 根据名称注入private RestTemplate restTemplateA;GetMapping(/nihao)public String nihao(){String url http://localhost:9099/api/provider/hello;ResponseEntityString forEntity restTemplateA.getForEntity(url,String.class);String body forEntity.getBody();System.out.println(消费者获取生产者提供的数据body);return body;}Resourceprivate RestTemplate restTemplateWith;GetMapping(/nihaox)public String nihaoX(){String url http://springCloud-provider/api/provider/hello;ResponseEntityString forEntity restTemplateWith.getForEntity(url, String.class);String body forEntity.getBody();System.out.println(消费者获取生产者提供的数据body);return body;}
}总结
1.微服务调用的几种方式异步消息传递http调用服务网关调用服务发现调用nacos 2.spring提供的restTemplate发送HTTP请求的客户端工具类 3.nacos使用服务名报错需要加Ribbon负载均衡