一.单体应用

1.什么是单体引用?
通常情况下,这个服务所对应的代码由多个项目所组成,各个项目会根据自身所提供功能的不同具有一个明确的边界。在编译时,这些项目将被打包成为一个个JAR包,并最终合并在一起形成一个WAR包
2.优缺点
①一个模块挂了,整个项目都受影响

②单个tomcat更能处理的并发有限,可以做集群,但是不方便局部(某一个模块)扩展
③维护/开发/升级比较麻烦
④代码臃肿,编译,打包都比较慢
⑤技术选型单一
⑥数据库选型单一

二、微服务架构

1.什么是微服务架构

微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。
	微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被技术选项,独立开发,独立部署,独立运维,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。 
	简而言之:微服务就是把一个大的系统,拆分成多个小的服务,每个微服务只专注一个业务 ,每个服务有各自的进程, 微服务之间使用网络通信协议进行数据交互(通常是基于HTTP的RESTful API)。

2.微服务远程调用方式

RPC:Remote Produce Call远程过程调用,类似的还有RMI。自定义数据格式,基于原生TCP通信,速度快,效率高。早期的webservice,现在热门的dubbo,都是RPC的典型
Http:http其实是一种网络传输协议,基于TCP,规定了数据传输的格式。现在客户端浏览器与服务端通信基本都是采用Http协议。也可以用来进行远程服务调用。缺点是消息封装臃肿。
现在热门的Rest风格,就可以通过http协议来实现

2.1rpc和http的比较

RPC并没有规定数据传输格式,这个格式可以任意指定,不同的RPC协议,数据格式不一定相同。

  • Http中还定义了资源定位的路径,RPC中并不需要
  • 最重要的一点:RPC需要满足像调用本地服务一样调用远程服务,也就是对调用过程在API层面进行封装。Http协议没有这样的要求,因此请求、响应等细节需要我们自己去实现。
  • 优点:RPC方式更加透明,对用户更方便。Http方式更灵活,没有规定API和语言,跨语言、跨平台
  • 缺点:RPC方式需要在API层面进行封装,限制了开发的语言环境

速度来看,RPC要比http更快,虽然底层都是TCP,但是http协议的信息往往比较臃肿,不过可以采用gzip压缩。

  • 难度来看,RPC实现较为复杂,http相对比较简单
  • 灵活性来看,http更胜一筹,因为它不关心实现细节,跨平台、跨语言。

因此,两者都有不同的使用场景:

  • 如果对效率要求更高,并且开发过程使用统一的技术栈,那么用RPC还是不错的。 dubbo
  • 如果需要更加灵活,跨语言、跨平台,显然http更合适 springcloud

3.微服务的优缺点

优点:
①数据库选型多样化
② 技术选型多样化
③每个微服务专注一个业务
④ 每个维护有自己的进程
⑤ 微服务之间通过网络协议进行通信
⑥方便做局部拓展
⑦ 开发/维护/升级更方便
缺点:
①成本高
② 技术要求比较高
③部署麻烦

4.MicroService实现技术

1.是一种架构的理念,提出了微服务的设计原则,从理论为具体的技术落地提供了指导思想。
2.java中可以使用传统ssm ssj等架构,当然更加推荐Springboot。Spring Boot是一套快速配置脚手架,可以基于Spring Boot快速开发单个微服务。
3.由于微服务架构中存在多个微服务,那么如何管理和协调这些服务呢?就需要服务治理框架,而springcloud就是一个基于Spring Boot实现的服务治理工具包。

3.Spring cloud

Spring cloud是什么?
Spring cloud是一个基于Spring Boot实现的服务治理工具包,用于微服务架构中管理和协调服务的。
组成:
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Springcloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
五大组成:
注册中心与服务发现——Netflix Eureka
客服端负载均衡——Netflix Ribbon\Feign
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config

5.注册中心的使用

1.创建一个父maven文件,在pom中导入springboot的jar包和springcloud的jar包。

<!--公共的utf-8-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <!--管理springboot-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
    </parent>

    <!--管理springcluod-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.SR1</version><!-- eureka版本 -->
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!--公共web包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--公共的junit包-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

2.创建子maven(eureka-service-1111当作服务器端),pom中导入服务端相应的jar包

<dependencies>
        <!--spring-cloud注册中心服务端jar包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

2.1创建主配置类——EurekaServiceApplication

//@EnableEurekaServer   开启注册中心(服务端)
@SpringBootApplication
@EnableEurekaServer
public class EurekaServiceApplication {

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

2.2resources中创建application.xml

server:
  port: 1111                     #服务器端接口
eureka:
  instance:
    hostname: localhost           #主机名
  client:
    registerWithEureka: false   #注册中心不注册自身信息
    fetchRegistry: false        #注册中心不获取注册地址清单
    serviceUrl:                 #注册中心地址
      defaultZone: http://locahost:1111/eureka/
  server:
    enable-self-preservation: false   #注册中心自我保护机制关闭

3.创建子maven(order-service-consumer-2222客户端——消费者),pom中导入客户端相关的jar包

<dependencies>
        <!--注册中心客户端导入的jar包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--spring-boot的web包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

3.1创建主配置类——OrderServiceCondumerApplication

@SpringBootApplication
@RestController
public class OrderServiceCondumerApplication {
    @RequestMapping("/")
    public String home() {
        return "Hello world";
    }

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

}

3.2resources中创建application.xml

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:1111/eureka/   #注册中心的地址
  instance:
    instance-id: order-server:2222    #指定id,指定客户端名字
    prefer-ip-address: true    #使用ip注册到注册中心
server:
  port: 2222   #客户端端口号
spring:
  application:
    name: order-server   #客户端名字

4.创建子maven(user-service-provider-3333 客户端,提供者),pom中导入客户端相应的jar包

<dependencies>
        <!--注册中心客户端导入的jar包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--spring-boot的web包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

4.1创建主配置类(UserServiceProviderApplication)

@SpringBootApplication
@RestController
public class UserServiceProviderApplication {
    @RequestMapping("/")
    public String home() {
        return "Hello world";
    }

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

4.2resources中创建application.xml

eureka:
  client:    #客户端
    serviceUrl:
      defaultZone: http://localhost:1111/eureka/     #注册中心地址
  instance:
    prefer-ip-address: true   #用ip注册到注册中心
    instance-id: user-service:3333  # 指定id
server:
  port: 3333   #客户端端口号
spring:
  application:
    name: user-service   #客户端名字

6.效果图

注册中心系我保护机制(设置的是关闭状态)

Spring Cloud Consul 高可用_微服务

添加的服务(消费者和提供者)

Spring Cloud Consul 高可用_spring_02

点击status,ip回显

Spring Cloud Consul 高可用_spring_03


Spring Cloud Consul 高可用_微服务_04