??????????????????????????????????🎉🎉欢迎来到我的CSDN主页!🎉🎉
????????????????????????🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚
????????🌟推荐给大家我的博客专栏《手把手带你门SpringCloud开发之入门级及nacos》。🎯🎯
????????????????????????🎁如果感觉还不错的话请给我关注加三连吧!🎁🎁
Spring Cloud是基于Spring Boot的一套用于构建分布式系统的框架套件。它提供了丰富的工具和组件,支持开发者快速构建、部署和管理云原生应用程序。
自己理解:用来作为一套解决多模块开发方案,这些模块直接的联系怎么去联系?依靠的是SpringCloud里面的组件。
以下是介绍SpringCloud相关组件(这里可能我们的比较炸,SpringCloud怎么还有这麽多的规则,方法,是不是特麻烦,在之后实际的开发中会知道,这样是非常的便捷的)
Eureka:服务注册与发现组件,用于解决分布式系统中服务注册与发现的问题。
Ribbon:客户端负载均衡组件,用于在消费者和服务提供者之间实现负载均衡。
Feign:声明式服务调用组件,支持通过注解方式来定义接口,并自动生成实现类,简化服务调用的代码编写。
Hystrix:容错处理组件,用于处理分布式系统中服务调用失败、超时等异常情况,并提供了服务隔离和熔断机制。
Zuul:API网关组件,用于将所有服务的入口统一到一个网关上,并提供了路由、过滤、限流等功能。
Config:分布式配置管理组件,用于解决分布式系统中配置管理的问题,提供了集中配置、动态刷新等功能。
各个服务启动时,1.(aliyu的是nacos)Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还 可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里 2.Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台 Feign:3.基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求 Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务 调用的隔离,避免了服务雪崩的问题 Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务流
流程梳理:1.请求统一通过API网关(Zuul)来访问内部服务. 2. 网关接收到请求后,从注册中心(Eureka)获取可用服务 3. 由Ribbon进行均衡负载后,分发到后端具体实例 4. 微服务之间通过Feign进行通信处理业务 5. Hystrix负责处理服务超时熔断
思维图:
Eureka是微服务架构中的注册中心,专门负责服务的注册与发现。
思考:订单服务想要调用库存服务、仓储服务,或者是积分服务,怎么调用?订单服务压根儿就不知道人家库存服务在哪台机器上啊!他就算想要发起一个请求,都不知道发送给谁?
这里我们借助Eureka就可以来找到了。
Eureka Client:负责将这个服务的信息注册到Eureka Server中
Eureka Server:注册中心,里面有一个注册表,保存了各个服务所在的机器和端口号
现在订单服务确实知道库存服务、积分服务、仓库服务在哪里了,同时也监听着哪些端口号了。 但是新问题又来了:如何从订单服务跟其他服务建立网络连接,接着发送请求过去。
这个组件是负责网络路由的。 一般微服务架构中都必然会设计一个网关在里面,像android、ios、pc前端、微信小程序、H5等等。 不用去关心后端有几百个服务,就知道有一个网关,所有请求都往网关走,网关会根据请求中的一些特 征,将请求转发给后端的各个服务。 有一个网关之后,还有很多好处,比如可以做统一的降级、限流、认证授权、安全,等
建立一个maven作为模块的父容器,方便将公共的依赖定义,子模块引用就可以
Provider
1.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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>provider</artifactId> <version>0.0.1-SNAPSHOT</version> <name>provider</name> <description>provider</description> <!-- 继承父类插件--> <parent> <groupId>org.example</groupId> <artifactId>SpringCould1</artifactId> <version>1.0-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <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> <version>${spring-boot.version}</version> <configuration> <mainClass>com.lya.provider.ProviderApplication</mainClass> <!-- <skip>true</skip>--> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
2.Controller(打上注解)
package com.lya.provider; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author 微微 */ @EnableDiscoveryClient @RestController public class ProviderController { @RequestMapping("/run") public String run() { return "🍗"; } }
3.启动类
package com.lya.provider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; /** * @author 微微 */ @SpringBootApplication @EnableDiscoveryClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }
application.yml配置
server: port: 8082 spring: application: name: provider cloud: nacos: server-addr: localhost:8848
?Consumer
1.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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>consumer</artifactId> <version>0.0.1-SNAPSHOT</version> <name>consumer</name> <description>consumer</description> <!-- 继承父类插件--> <parent> <groupId>org.example</groupId> <artifactId>SpringCould1</artifactId> <version>1.0-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <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> <version>${spring-boot.version}</version> <configuration> <mainClass>com.lya.consumer.ConsumerApplication</mainClass> <!-- <skip>true</skip>--> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
2.Controller
package com.lya.consumer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; /** * @author 微微 */ @EnableDiscoveryClient @RestController public class ConsumerController { @Autowired private RestTemplate restTemplate; @RequestMapping("/run") public String run() { return restTemplate.getForObject("http://provider/run", String.class); }}
3.启动类
package com.lya.consumer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; /** * @author 微微 */ @SpringBootApplication @EnableDiscoveryClient public class ConsumerApplication { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
4.application.yml配置
server: port: 8083 spring: application: name: consumer cloud: nacos: server-addr: localhost:8848
nacos下载可以参考这一篇博客:
下载完成解压启动
登录是否连接上nacos:
连接上:
如果没有连接上:去查看是不是没有写注解:
在写demo中遇到报的异常:
?Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://provider/run": provider; nested exception is java.net.UnknownHostException: provider] with root cause
java.net.UnknownHostException: provider
原因:找不到这ResourceAccessException
这里要去排查:nacos应用的配置是否完整
找到问题没有导入解决:添加依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> </dependency>