springCloud入门

Posted Study preparation

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springCloud入门相关的知识,希望对你有一定的参考价值。

springCloud入门

1. 单体应该用和微服务

1.1 单体应用

1) 什么是单体应用:

项目所有的资源都在一个应用中,打包成war包,使用一个tomcat去运行,运行在一个进程中

2) 单体应用的问题

a. 一个模块挂了,整个项目都受影响

b. 单个tomcat更能处理的并发有限,可以做集群,但是不方便局部(某一个模块)扩展

c. 维护/开发/升级比较麻烦

d. 代码臃肿,编译,打包都比较慢

e. 技术选择单一

f. 数据库选型单一

①编译难,部署难,测试难

②技术选择难

③扩展难

1.2 微服务架构

1) 什么是微服务架构

微服务就是把一个大的系统,拆分成多个晓得服务,每个微服务只专注一个业务,每个服务有各自的进程,微服务之间使用网络通信协议进行数据交互(通常是基于HTTPRESTful风格)

2) 微服务的特点

a. 数据库选型多样化

b. 技术选型多样化

c. 每个微服务专注一个业务

d. 每个维护有自己的进程

e. 微服务之间通过网络协议进行通信

f. 方便做局部扩展

g. 开发/维护/升级更方便

1.3 系统改怎么选择单体应用还是微服务架构

 

 

 

单体应用架构:中小型项目(功能相对较少) crm 档案管理 库存管理,公司官网等

        

微服务架构:大型项目(功能比较多) 商城 erp,人力资源等

2. SpringCloud入门

2.1 springCloud是什么

Spring cloud是一个基于Spring Boot实现的服务治理工具包,用于微服务架构中管理和协调服务的。

2.2 组成架构

 

 

 

2.3 核心

五大神兽:

服务注册发现——Netflix Eureka  注册所有微服务的通信地址

客服端负载均衡——Netflix Ribbon\\Feign :服务之间的调用问题

断路器——Netflix Hystrix :解决微服务故障问题,微服务的隔离

服务网关——Netflix Zuul :微服务的统一入口

分布式配置——Spring Cloud Config :统一管理微服务的配置文件

3. springCloud入门环境搭建

3.1 结构分析

 

 

 

3.2 搭建父模块(sringcloud-parent)

1) 导入依赖

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    <springboot.version>2.0.5.RELEASE</springboot.version>
</properties>

<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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${springboot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

 

3.3 搭建功能模块(product-common)

存放功能代码 domain,mapper,query...

 

 

 

3.3 搭建服务的提供者(product-service-8001)

1) 引入依赖

<!--        引入公共依赖-->
        <dependency>
            <groupId>cn.dyier</groupId>
            <artifactId>product-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!--springboot支持-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <!-- mysql 数据库驱动. -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

<!--        springboot mybatis相关依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>

 

2) application.yml配置

server:
  port: 8001
spring:
  application:
    name: PRODUCT-SERVICE #服务名
  #配置datasource
  datasource:
    url: jdbc:mysql:///test?useSSL=false
    username: root
    password: 123456
#mybatis包代理
mybatis:
  type-aliases-package: cn.dyier.domain, cn.dyier.query

 

3) 入口类

@SpringBootApplication
@MapperScan("cn.dyier.mapper")
public class ProductService8001Application {
    public static void main(String[] args) {
        SpringApplication.run(ProductService8001Application.class, args);
    }
}
ProductService8001Applica

 

4) Controller层代码(关键)

@RestController
@RequestMapping("/product")
public class ProductController {
    @Autowired
    private ProductService productService;

    /**
     * 根据id查询单条数据
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Product findOne(@PathVariable(name = "id") Long id) {
        return productService.findOne(id);
    }
}
ProductController

 

3.4 搭建服务消费者(order-server-9001)

1)导入依赖

<!--        引入公共依赖-->
        <dependency>
            <groupId>cn.dyier</groupId>
            <artifactId>product-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!--springboot支持-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

 

2)配置yml

server:
  port: 9001
spring:
  application:
    name: ORDER-SERVICE #服务名称

3)入口类和服务提供者相同

4)配置类 提供RestTemplate(为了调用远程接口)

@Configuration
public class BaseConfig {
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

 

5contoller(关键)

@RestController
@RequestMapping("/order")
public class OrderController {
    /**
     * 写死的前置地址
     */
    private final String URL_PREFIX = "http://localhost:8001/product/";

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/product/{id}")
    public Product findOne(@PathVariable(name = "id") Long id) {
        String url = URL_PREFIX + id;
        return restTemplate.getForObject(url, Product.class);
    }
}
OrderController

 

4. springCloud Eureka

4.1 Eureka是什么

  Eurekanetflix的一个子模块,也是核心模块之一,Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务发现和注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务,而不需要修改服务调用的配置文件了,功能类似于dubbo的注册中心,比如zookeeper

4.2 原理

 

 

4.3 Eureka注册中心搭建(eureka-server-7001)

1)导入依赖

<!--springboot支持-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>

<!--Eureka服务端支持-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

 

2)yml配置

server:
  port: 7001
eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false #是否要注册到eureka
    fetchRegistry: false #表示是否从Eureka Server获取注册信息
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机配置

3)主类

@SpringBootApplication
@EnableEurekaServer //标识为eureka服务端
public class EurekaServer7001Application {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServer7001Application.class, args);
    }
}
EurekaServer7001Application

 

4)启动

启动入库类访问localhost:7001

 

 

4.4 注意事项

1)自我保护引发的错误

 

 

 

 

Eureka自我保护机制导致,不影响使用.

2)显示IP地址

问题:

解决方案:  在客户端yml配置

   eureka:
  client:
    service-url:
     defaultZone: http://localhost:7001/eureka  #告诉服务提供者要把服务注册到哪儿
  instance:
    prefer-ip-address: true #显示客户端真实ip

4.5 服务提供者注册到Eureka

1)导入eureka依赖

<!--eureka客户端支持 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

 

2yml配置

eureka:
  client:
    service-url:
     defaultZone: http://localhost:7001/eureka #告诉服务提供者要把服务注册到哪儿

 instance:

    prefer-ip-address: true # 当调用getHostname获取实例的hostname时,返回ip而不是host名称

ip-address: 127.0.0.1 # 指定自己的ip信息,不指定的话会自己寻找

3)启动类配置eureka客户端

加上@EnableEurekaClient注解

以上是关于springCloud入门的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud系列四:Eureka 服务发现框架(定义 Eureka 服务端Eureka 服务信息Eureka 发现管理Eureka 安全配置Eureka-HA(高可用) 机制Eur(代码片段

推荐net开发cad入门阅读代码片段

SpringCloud入门[转]

[菜鸟SpringCloud入门]第一章:构建多模块的Maven项目+创建注册中心Eureka子模块

[菜鸟SpringCloud实战入门]第八章:通过消息总线Bus实现配置文件统一刷新(使用Kafka)

Java 微服务之 SpringCloud快速入门day02 Feign