自己做网站花费,莱芜网站制作,无锡网站制作楚天软件,接单子做网站词文章目录 一、搭建Nacos服务1、Nacos2、安装Nacos3、Docker安装Nacos 二、OpenFeign和Dubbo远程调用Nacos的服务1、搭建SpringCloudAlibaba的开发环境1.1 构建微服务聚合父工程1.2 创建子模块cloud-provider-payment80011.3 创建子模块cloud-consumer-order80 2、远程服务调用O… 文章目录 一、搭建Nacos服务1、Nacos2、安装Nacos3、Docker安装Nacos 二、OpenFeign和Dubbo远程调用Nacos的服务1、搭建SpringCloudAlibaba的开发环境1.1 构建微服务聚合父工程1.2 创建子模块cloud-provider-payment80011.3 创建子模块cloud-consumer-order80 2、远程服务调用OpenFeign2.1 Dubbo和OpenFeign的区别2.2 创建子模块cloud-consumer-openfeign-order802.3 OpenFeign实现服务降级 3、远程服务调用Dubbo3.1 创建接口服务工程cloud-service-api3.2 创建支付生产者工程cloud-dubbo-provider-payment80013.3创建消费者cloud-dubbo-consumer-order803.4 Dubbo实现服务降级 总结 一、搭建Nacos服务
1、Nacos
Nacos是阿里巴巴开源的服务注册中心以及配置中心致力于给开发者提供一款便捷、简单上手的开源框架。 Nacos包含了SpringCloud的注册中心Eureka、服务配置Config、服务总线Bus。Nacos提供四大功能分别是服务发现和服务健康监测、动态配置服务、动态DNS服务、服务及其元数据管理。 1服务发现和服务健康监测 Nacos使服务更容易注册并通过DNS或HTTP接口发现其他服务Nacos还提供服务的实时健康检查以防止向不健康的主机或服务实例发送请求。 2动态配置服务 动态配置服务允许在所有环境中以集中和动态的方式管理所有服务的配置。Nacos消除了在更新配置时重新部署应用程序这使得配置的更改更加高效和灵活。 3动态DNS服务 Nacos提供基于DNS协议的服务发现能力旨在支持异构语言的服务发现支持将注册在Nacos上的服务以域名的方式暴露端点让第三方应用方便查阅及发现。 4服务及其元数据管理 Nacos能让你从微服务平台建设的视觉去管理数据中心的所有服务及元数据包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略。
2、安装Nacos
在官网下载Linux的Nacos安装包https://github.com/alibaba/nacos/releases通过mobax将安装包上传到虚拟机的/opt目录下解压到/usr/local目录下tar -zxvf nacos-server-2.2.3.tar.gz -C /usr/local需要在虚拟机上配置JDK8以上的环境https://blog.csdn.net/weixin_49076273/article/details/126636650进入到nacos的bin目录下启动单机模式的nacos服务器sh startup.sh -m standalone在浏览器访问http://192.168.126.32:8848/nacos/
3、Docker安装Nacos 安装Dockerhttps://blog.csdn.net/weixin_49076273/article/details/126532188 使用Docker拉取镜像docker pull nacos/nacos-server:v2.2.0 单机版部署docker run --name nacos -d -p 8848:8848 -p 9848:9848 -p 9849:9849 -e MODEstandalone -e NACOS_SERVER_IP192.168.126.32 nacos/nacos-server:v2.2.0 在浏览器访问http://192.168.126.32:8848/nacos/ 帐号密码都是nacos 使用docker容器搭建nacos如果是nacos2.x需要把9848,9849这两个端口开放出来即可这样就可以使用IDEA连接上Nacos。如果是1.x则直接使用8848端口即可
二、OpenFeign和Dubbo远程调用Nacos的服务
1、搭建SpringCloudAlibaba的开发环境
1.1 构建微服务聚合父工程 创建父工程springcloudalibaba 配置注解生效激活 Java编译版本选择 父工程的POM文件 ?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.zzx/groupIdartifactIdspringcloudalibaba/artifactIdversion1.0-SNAPSHOT/version!-- 统一管理jar包版本 --propertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.targetspring-cloud.version2021.0.0/spring-cloud.versionspring-boot.version2.6.3/spring-boot.version/properties!-- 子模块继承之后提供作用锁定版本子modlue不用写groupId和version --dependencyManagementdependencies!--spring boot 2.6.3--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion${spring-boot.version}/versiontypepom/typescopeimport/scope/dependency!--spring cloud 2021.0.0--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring-cloud.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagement/projectIDEA开启Dashboard 1修改配置文件.idea/workspace.xml 2添加如下配置 component nameRunDashboardoption nameruleStateslistRuleStateoption namename valueConfigurationTypeDashboardGroupingRule //RuleStateRuleStateoption namename valueStatusDashboardGroupingRule //RuleState/list/optionoption nameconfigurationTypessetoption valueSpringBootApplicationConfigurationType //set
/option
/component删除src目录
1.2 创建子模块cloud-provider-payment8001 在父工程下右键创建子模块cloud-provider-payment8001 在cloud-provider-payment8001的POM文件中添加如下依赖 dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency
/dependencies创建cloud-provider-payment8001的主启动类 package com.zzx;import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** 主启动类*/// 注解开启注册发现服务功能
EnableDiscoveryClient
SpringBootApplication
Slf4j
public class PaymentMain8001 {public static void main(String[] args) {SpringApplication.run(PaymentMain8001.class,args);log.info(****** PaymentMain8001 启动成功 ******);}
} 在cloud-provider-payment8001的com.zzx.controller包下创建PaymentController package com.zzx.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** 支付控制层*/
RestController
RequestMapping(payment)
public class PaymentController {GetMapping(index)public String index(){return payment success;}
}在cloud-provider-payment8001的resources中创建application.yml文件 server:port: 8001
spring:application:name: payment-providercloud:nacos:discovery:# Nacos服务的地址server-addr: 192.168.126.32:8848启动payment8001项目后在Nacos中的服务管理的服务列表中会出现该服务
1.3 创建子模块cloud-consumer-order80 在父工程下右键创建子模块cloud-consumer-order80 在cloud-consumer-order80的POM文件中添加如下依赖 dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency
/dependencies创建cloud-consumer-order80的主启动类 package com.zzx;import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** 主启动类*/// 注解开启注册发现服务功能
EnableDiscoveryClient
SpringBootApplication
Slf4j
public class OrderMain80 {public static void main(String[] args) {SpringApplication.run(OrderMain80.class,args);log.info(****** OrderMain80 启动成功 ******);}
} 在cloud-consumer-order80的resources中创建application.yml文件 server:port: 80
spring:application:name: order-consumercloud:nacos:discovery:# Nacos服务的地址server-addr: 192.168.126.32:8848启动order80项目后在Nacos中的服务管理的服务列表中会出现该服务
2、远程服务调用OpenFeign
2.1 Dubbo和OpenFeign的区别
Apache Dubbo是一款微服务开发框架他提供了RPC通信与微服务治理两大关键能力。这意味着使用Dubbo开发的微服务将具备相互之间的远程发现和通信能力同时利用Dubbo提供的丰富服务治理能力可以实现诸如服务发现、负载均衡、流量调控等服务治理诉求。SpringCloud的通信采用OpenFeign组件。Feign基于Http传输协议底层实现是Rest。从OSI7层模型上来看Rest属于应用层。 OpenFeign在高并发场景下性能不够理想成为性能瓶颈。 使用场景并发不高性能要求也不高Dubbo框架的通信协议采用RPC协议属于传输层协议性能上自然比rest高。提升了交互的性能保持了长连接高性能。 Dubbo性能更好比如支持异步调用、Netty性能更好。 使用场景数据小并发高
2.2 创建子模块cloud-consumer-openfeign-order80 在父工程下右键创建子模块cloud-consumer-openfeign-order80 在cloud-consumer-openfeign-order80的POM文件中添加如下依赖 dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency!-- 引入openfeign依赖包 --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependency!-- 引入负载均衡器依赖包 --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId/dependency
/dependencies创建cloud-consumer-openfeign-order80的主启动类 package com.zzx;import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;/*** 主启动类*/// 注解开启注册发现服务功能
EnableDiscoveryClient
// 开启feign扫描
EnableFeignClients
SpringBootApplication
Slf4j
public class OrderOpenFeignMain80 {public static void main(String[] args) {SpringApplication.run(OrderOpenFeignMain80.class,args);log.info(****** OrderOpenFeignMain80 启动成功 ******);}
} 在cloud-consumer-openfeign-order80的com.zzx.service包中创建IPaymentFeignService接口 package com.zzx.service;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;/*** OpenFeign远程调用*/
Service
FeignClient(value payment-provider)
public interface IPaymentFeignService {GetMapping(/payment/index)String index();
} 在cloud-consumer-openfeign-order80的com.zzx.controller包中创建OrderController package com.zzx.controller;import com.zzx.service.IPaymentFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** 订单微服务*/
RestController
RequestMapping(order)
public class OrderController {Autowiredprivate IPaymentFeignService iPaymentFeignService;/*** 测试OpenFeign* return*/GetMapping(index)public String index(){return iPaymentFeignService.index();}
} 在cloud-consumer-openfeign-order80的resources中创建application.yml文件 server:port: 80
spring:application:name: order-consumer-openfeigncloud:nacos:discovery:# Nacos服务的地址server-addr: 192.168.126.32:8848启动openfeign-order80项目后在Nacos中的服务管理的服务列表中会出现该服务 在浏览器上测试使用OpenFeign进行远程服务调用输入http://localhost/order/index 此时返回payment success即调用成功
2.3 OpenFeign实现服务降级 在cloud-consumer-openfeign-order80的POM文件中引入服务降级的依赖 !-- 引入服务降级依赖包 --
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId
/dependency在cloud-consumer-openfeign-order80的resources下的application.yml文件中添加如下配置开启openfeign对sentinel的支持 feign:sentinel:enabled: true在cloud-provider-payment8001的PaymentController中添加如下超时方法 GetMapping(timeout)
public String timeout(){try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {throw new RuntimeException(e);}return payment success;
}在cloud-consumer-openfeign-order80的OrderController中添加如下超时方法 GetMapping(timeout)
public String timeout(){return iPaymentFeignService.timeout();
}在cloud-consumer-openfeign-order80的IPaymentFeignService中添加如下超时方法 GetMapping(/payment/timeout)
String timeout();在浏览器上测试使用OpenFeign进行远程服务调用输入http://localhost/order/timeout 此时返回报500错误控制台显示读取超时 实现服务降级的回调方法 需要在cloud-consumer-openfeign-order80的IPaymentFeignService接口中指定服务降级回调类 FeignClient(value payment-provider,fallback PaymentServiceFallback.class)2在cloud-consumer-openfeign-order80的com.zzx.fallback包下创建PaymentServiceFallback服务降级回调类 package com.zzx.fallback;import com.zzx.service.IPaymentFeignService;
import org.springframework.stereotype.Component;Component
public class PaymentServiceFallback implements IPaymentFeignService {Overridepublic String index() {return null;}/*** 服务降级方法* return*/Overridepublic String timeout() {return 系统繁忙请稍后再试;}
}
在浏览器访问http://localhost/order/timeout 此时会进行服务降级回调服务降级类对应的方法
3、远程服务调用Dubbo
3.1 创建接口服务工程cloud-service-api 在父工程下右键创建子模块cloud-service-api 创建一个公共支付接口 package com.zzx.service;/*** 支付接口*/
public interface IPaymentService {String index();
}3.2 创建支付生产者工程cloud-dubbo-provider-payment8001 在父工程下右键创建子模块cloud-dubbo-provider-payment8001 在cloud-dubbo-provider-payment8001的POM文件中添加如下依赖 dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependencydependencygroupIdcom.zzx/groupIdartifactIdcloud-service-api/artifactIdversion1.0-SNAPSHOT/version/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-dubbo/artifactIdversion2021.0.1.0/version/dependency!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-lang3/artifactIdversion3.12.0/version/dependency
/dependencies在cloud-dubbo-provider-payment8001中创建主启动类PaymentDubboMain8001 package com.zzx;import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** 主启动类*/
SpringBootApplication
Slf4j
EnableDiscoveryClient
public class PaymentDubboMain8001 {public static void main(String[] args) {SpringApplication.run(PaymentDubboMain8001.class,args);log.info(********** PaymentDubboMain8001 启动成功 ***********);}
} 在cloud-dubbo-provider-payment8001的resources中创建application.yml添加如下配置 server:port: 8001
spring:main:allow-bean-definition-overriding: trueallow-circular-references: trueapplication:# 应用名name: payment-provider-dubbocloud:nacos:discovery:# Nacos服务地址server-addr: 192.168.126.32:8848
# dubbo配置
dubbo:# dubbo 服务实现类扫描包scan:base-packages: com.zzx.serviceregistry:# 注册地址address: nacos://192.168.126.32:8848timeout: 10000# Dubbo服务暴露协议的配置protocol:name: dubbo# port为协议端口-1表示自增端口从20880开始port: -1在cloud-dubbo-provider-payment8001中创建支付业务层PaymentServiceImpl package com.zzx.service.impl;import com.zzx.service.IPaymentService;
import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.config.annotation.Method;/*** 支付业务层*/
//以下是只将index方法注册到dubbo中
DubboService(timeout 5000,methods {Method(nameindex,retries 2)})
public class PaymentServiceImpl implements IPaymentService {Overridepublic String index() {return dubbo payment;}
} 启动该服务后查看该服务是否在Nacos中注册
3.3创建消费者cloud-dubbo-consumer-order80 在父工程下右键创建子模块cloud-dubbo-consumer-order80 在cloud-dubbo-consumer-order80的POM文件中添加如下依赖 dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependencydependencygroupIdcom.zzx/groupIdartifactIdcloud-service-api/artifactIdversion1.0-SNAPSHOT/version/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-dubbo/artifactIdversion2021.0.1.0/version/dependency!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-lang3/artifactIdversion3.12.0/version/dependency/dependencies创建cloud-dubbo-consumer-order80的主启动类 package com.zzx;import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;SpringBootApplication
Slf4j
EnableDiscoveryClient
public class OrderDubboMain80 {public static void main(String[] args) {SpringApplication.run(OrderDubboMain80.class,args);log.info(******* OrderDubboMain80 启动成功 ******);}
} 在cloud-dubbo-consumer-order80的resources中创建application.yml配置文件添加如下配置 server:port: 80
spring:main:allow-circular-references: true#在 Spring Boot 2.1 以及更高的版本增加该设定因为 Spring Boot 默认调整了 Bean 定义覆盖行为。allow-bean-definition-overriding: trueapplication:#应用名字name: order-consumer-dubbocloud:nacos:discovery:#Nacos地址server-addr: 192.168.126.32:8848#dubbo配置
dubbo:cloud:#dubbo.cloud.subscribed-services表示要订阅服务的服务名可以配置*代表订阅所有服务不推荐使用。若需订阅多应用使用 , 分割。subscribed-services: *registry:# 注册至Nacosaddress: nacos://192.168.126.32:8848# 超时时间timeout: 10000protocol:# 协议Dubboname: dubbo# 端口号port: -1consumer:check: false 在cloud-dubbo-consumer-order80中创建订单业务层OrderService package com.zzx.service;import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;/*** 订单业务层*/
Service
public class OrderService {//支付服务远程调用DubboReferenceprivate IPaymentService iPaymentService;public String index(){return iPaymentService.index();}
} 在cloud-dubbo-consumer-order80中创建订单控制层OrderController package com.zzx.controller;import com.zzx.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** 订单控制层*/
RestController
RequestMapping(/order)
public class OrderController {Autowiredprivate OrderService orderService;/*** 测试Dubbo远程调用服务* return*/GetMapping(/index)public String index(){return orderService.index();}
} 启动该服务后在浏览器访问http://localhost/order/index
3.4 Dubbo实现服务降级 在cloud-dubbo-provider-payment8001的PaymentServiceImpl实现类中设置服务生产者集群容错模式cluster DubboService(timeout 5000,methods {Method(nameindex,retries 2)},cluster failfast)1Failfast Cluster模式这种模式称为快速失败模式调用只执行一次失败则立即报错。 2Failsafe Cluster模式失败安全模式如果调用失败 则直接忽略失败的调用而是要记录下失败的调用到日志文件。 3Failback Cluster模式失败自动恢复后台记录失败请求定时重发。通常用于消息通知操作。 4Forking Cluster模式并行调用多个服务器只要一个成功即返回。通常用于实时性要求较高的读操作但需要浪费更多服务资源。 5Broadcast Cluster模式配置值为broadcast。广播调用所有提供者逐个调用任意一台报错则报错2.1.0开始支持。通常用于通知所有提供者更新缓存或日志等本地资源信息。 在cloud-dubbo-consumer-order80中创建服务降级的回调类PaymentServiceFallback package com.zzx.service.fallback;import com.zzx.service.IPaymentService;/*** 支付服务降级处理*/
public class PaymentServiceFallback implements IPaymentService {Overridepublic String index() {return 服务繁忙请稍后再试;}
} 在cloud-dubbo-consumer-order80的OrderService中在DubboReference注解中添加一个mock指定回调类 DubboReference(mock com.zzx.service.fallback.PaymentServiceFallback)先将dubbo的生产者跟消费者启动然后关闭生产者再访问http://localhost/order/index 即配置了访问服务生产者失败后立刻调用服务降级类的对应方法。
总结
在高并发场景下使用Dubbo因为Dubbo长连接如果不是高并发会浪费资源低并发或者性能要求不高使用OpenFeign因为OpenFeign不是长连接并且便于使用。