微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SpringCloud微服务

什么是微服务

微服务就是不同的模块部署在不同的服务器上面,通过接口去访问就是微服务
作用:利用分布式解决网站高并发带来的问题

什么是集群

多台服务器部署相同应用构成一个集群
作用:通过负载均衡设备共同对外提供服务

什么是RPC?

RPC是一种面向接口的远程调用形式。它允许程序调用一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。比如两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数或者方法,由于不在一个内存空间,不能直接调用,这时候需要通过就可以应用RPC框架的实现来解决

有哪些微服务远程调用框架:WebService,dubbo,SpringCloud

Restful,Soap,rpc

Restful:是一种架构设计风格,提供了设计原则和约束条件,而不是架构。而满足这些约束条件和原则的应用程序或设计就是 Restful架构或服务。主要是JSON实现(可以简单的理解restful就是Json)
Soap:了解过WebService的同学可能了解过soap,他是一种数据交换规范,是基于XML协议的一种简单的、轻量级的规范。请求包格式为Xml。
SOAP的消息是基于xml并封装成了符合http协议,因此,它符合任何路由器、 防火墙或代理服务器的要求。
soap可以使用任何语言来完成,只要发送正确的soap请求即可,基于soap的服务可以在任何平台无需修改即可正常使用。
Rpc:RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数方法(可以统称为服务)并得到返回的结果。
RPC 是一个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式)
RPC 在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。

SOA和微服务的区别

SOA:面向服务(暴露接口),业务系统分解为多个组件,让每个组件都独立提供离散,自治,可复用的服务能力。通过服务的组合和编排来实现上层的业务流程。是一种面向服务的架构理念
微服务:是SOA的升华版本,多模块之间采用RPC远程调用技术。架构设计概念,各服务间隔离(分布式也是隔离),自治(分布式依赖整体组合)其它特性(单一职责,边界,异步通信,独立部署)是分布式概念的跟严格执行。

SpringCloud

SpringCloud为我们开发人员提供了快速构建分布式的一套工具,包括配置管理,服务发现(Eureka注册中心),服务消费(ribbon和Feign),路由(负载均衡),断路器。。。。一套完整的分布式微服务的治理框架。SpringCloud完全使用SpringBoot构建项目。

服务提供者+消费者

服务提供者:就是提供服务被别人调用
消费者:调用别人暴露出来的接口
(举例生产者和消费者关系)

SpringCloud注册中心(Eureka)

注册中心的作用就是用来方便接口暴露出来的一个管理工具,如果所有的接口只是暴露出来,没有一个统一的管理工具,又有谁知道你暴露了那些接口了,其他的开发人员怎么知道我们暴露了哪些接口出来呢。eureka是一个SpringCloud的服务注册和发现模块。
这里我们首先去搭建我们的注册中心项目。

创建EurekaServer项目

采用Maven Project

第一步:创建一个空的Maven项目springcloud,然后在springcloud项目创建新的Module-springboot项目,方便管理微服务。

第二步: 创建注册中心

  1. 选择依赖:

    在这里插入图片描述

结果:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.10.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.entor</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-server</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR11</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <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>
        </dependencies>
    </dependencyManagement>

接下来启动注册中心就可以了

@SpringBootApplication
@EnableEurekaServer//开启注册中心
public class EurekaServerApplication {

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

启动成功

在这里插入图片描述

创建EurekaProvider项目

服务提供者就是提供一个服务暴露出来给别人调用,在SpringCloud中我们需要注册服务到我们的注册中心。

第一步: 在springcloud项目下创建一个新的Module,springboot项目
第二步: 引入依赖

在这里插入图片描述

结果

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.10.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.entor</groupId>
    <artifactId>eureka-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-provider</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR11</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <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>
        </dependencies>
    </dependencyManagement>

第三步: 服务提供者的配置文件

server:
  port: 9101
spring:
  application:
    #应用名称,区分不同的应用
    name: eureka-provider
eureka:
  client:
    service-url:
      #服务注册的地址,eureka注册中心的地址
      defaultZone: http://localhost:9001/eureka
    #每隔5秒去注册中心拉取服务列表信息到本地
    registry-fetch-interval-seconds: 5
  instance:
    #服务重新续约持续的时间(该服务每隔5(认30秒)秒向注册中心发生心跳,表明该服务还能够正常连接还能够提供服务)
    lease-renewal-interval-in-seconds: 5
    #注册中心每隔15秒向服务发生心跳,检测服务是否正常
    lease-expiration-duration-in-seconds: 15
    #注册中心显示服务的ip地址,认是显示计算机名称
    prefer-ip-address: true
    #注册中心显示的服务实例名称
    instance-id: ${spring.application.name}-${spring.port}

第四步: 服务提供者对外提供的接口(控制层)

@RestController
public class HelloController {
    @Value("${server.port}")
    private String port;
    @RequestMapping(value = "hello")
    public String hello(String name){
        return "当前端口号:"+port+",hello "+name;
    }
}

第五步: 开启注册中心客户端

@SpringBootApplication
@EnableEurekaClient
public class EurekaProviderApplication {

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

接下来启动两次该服务提供者

在这里插入图片描述

第一次启动端口号为9101,第二次启动时修改为9102

刷新注册中心,发现两个服务提供者已经注册进来了。

在这里插入图片描述

消费者创建

消费者其实和服务提供者是一个性质,都是可以提供服务和进行消费的。本次分开主要是体现一个服务调用一个服务接口的方式。

在微服务分布式中,业务都会被拆分成一个独立的服务,并且在多个服务器上部署相同的服务。服务与服务的通讯是基于http restful的。SpringCloud我们会使用到两种消费工具,Ribbon+Feign。
Ribbon实现了服务的负载均衡
Feign认集成了Ribbon。
所以一般情况下我们使用Feign作为消费端,本次使用Ribbon。

我们这里去启动两个服务提供者,将提供者端口9101和9102分别启动,可以在9001 Eureka服务查看到两个服务,方便我们看到Ribbon实现负载均衡

第一步: 在springboot的下创建Module-springboot
第二步: 引入依赖

在这里插入图片描述


结果

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.10.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.entor</groupId>
    <artifactId>eureka-customer-ribbon</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-customer-ribbon</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR11</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>

        <!-- 手动添加的断路器 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <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>
        </dependencies>
    </dependencyManagement>

第三步: 消费者配置文件
与服务提供者配置方式一样

server:
  port: 9201
spring:
  application:
    name: eureka-customer-ribbon
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9001/eureka
    registry-fetch-interval-seconds: 5
  instance:
    prefer-ip-address: true
    instance-id: eureka-customer-ribbon-9201
    lease-renewal-interval-in-seconds: 5
    lease-expiration-duration-in-seconds: 15

第四步:创建消费者接口(控制层)

@RestController
public class HelloController {
    @Autowired
    private HelloService helloServicel;

    @RequestMapping("/hello")
    //断路器,如果访问的服务器发生异常,则调用断路器指定的回调方法
    @HystrixCommand(fallbackMethod = "helloError")//需要添加断路器依赖
    public String hello(String name) {
        return helloServicel.hello(name);
    }

    public String helloError(String name){
        return "您好:"+name+"服务器异常";
    }
}

第五步:服务层
注册一个工具类

@SpringBootApplication
@EnablediscoveryClient//服务发现客户端(调用服务需要这个)
@EnableHystrix//开启断路器
public class EurekaCustomerRibbonApplication {

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

    @Bean
    @LoadBalanced//装配RestTemplate类开启负载均衡
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

服务层

@Service
public class HelloServiceImpl implements HelloService {
    @Autowired
    private RestTemplate restTemplate;

    @Override
    public String hello(String name) {
        // 使用restTemplate工具类,restful方式调用接口
        // eureka-provider是服务在注册中心的名称
        // 该名称下可以有多台服务器实例,实现负载均衡访问
        return restTemplate.getForObject("http://eureka-provider/hello?name=" + name, String.class);
    }
}

启动该类就可以调用服务着的接口,并且Ribbon还能帮我们实现负载均衡。

在这里插入图片描述


接口调用

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐