手把手带你门SpringCloud

发布时间:2024年01月06日

??????????????????????????????????🎉🎉欢迎来到我的CSDN主页!🎉🎉

????????????????????????🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚

????????🌟推荐给大家我的博客专栏《手把手带你门SpringCloud开发之入门级及nacos》。🎯🎯

????????????????????????🎁如果感觉还不错的话请给我关注加三连吧!🎁🎁

1、什么是 SpringCloud?

Spring Cloud是基于Spring Boot的一套用于构建分布式系统的框架套件。它提供了丰富的工具和组件,支持开发者快速构建、部署和管理云原生应用程序。

自己理解:用来作为一套解决多模块开发方案,这些模块直接的联系怎么去联系?依靠的是SpringCloud里面的组件。

以下是介绍SpringCloud相关组件(这里可能我们的比较炸,SpringCloud怎么还有这麽多的规则,方法,是不是特麻烦,在之后实际的开发中会知道,这样是非常的便捷的)

SpringCloud常用组件:

  1. Eureka:服务注册与发现组件,用于解决分布式系统中服务注册与发现的问题。

  2. Ribbon:客户端负载均衡组件,用于在消费者和服务提供者之间实现负载均衡。

  3. Feign:声明式服务调用组件,支持通过注解方式来定义接口,并自动生成实现类,简化服务调用的代码编写。

  4. Hystrix:容错处理组件,用于处理分布式系统中服务调用失败、超时等异常情况,并提供了服务隔离和熔断机制。

  5. Zuul:API网关组件,用于将所有服务的入口统一到一个网关上,并提供了路由、过滤、限流等功能。

  6. 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负责处理服务超时熔断

思维图:

2,SpringCloud相关组件:Eureka

Eureka是微服务架构中的注册中心,专门负责服务的注册与发现。

思考:订单服务想要调用库存服务、仓储服务,或者是积分服务,怎么调用?订单服务压根儿就不知道人家库存服务在哪台机器上啊!他就算想要发起一个请求,都不知道发送给谁?

这里我们借助Eureka就可以来找到了。

Eureka Client:负责将这个服务的信息注册到Eureka Server中

Eureka Server:注册中心,里面有一个注册表,保存了各个服务所在的机器和端口号

3,Spring Cloud核心组件:Feign

现在订单服务确实知道库存服务、积分服务、仓库服务在哪里了,同时也监听着哪些端口号了。 但是新问题又来了:如何从订单服务跟其他服务建立网络连接,接着发送请求过去。

4,Spring Cloud核心组件:Zuul

这个组件是负责网络路由的。 一般微服务架构中都必然会设计一个网关在里面,像android、ios、pc前端、微信小程序、H5等等。 不用去关心后端有几百个服务,就知道有一个网关,所有请求都往网关走,网关会根据请求中的一些特 征,将请求转发给后端的各个服务。 有一个网关之后,还有很多好处,比如可以做统一的降级、限流、认证授权、安全,等

上手demo:

建立一个maven作为模块的父容器,方便将公共的依赖定义,子模块引用就可以

建立两个SpringBoot的项目,也就是以后企业中开发的模块

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

5,nacos的集成使用

nacos下载可以参考这一篇博客:

Nacos下载安装与配置(windows)-CSDN博客

下载完成解压启动

登录是否连接上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>

文章来源:https://blog.csdn.net/m0_73647713/article/details/135418068
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。