学习微服务笔记

1.什么是Docker

Docker 是世界领先的软件容器平台。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样

2.为什么要使用Docker

容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。

具体说来,Docker 在如下几个方面具有较大的优势。

2.1、更快速的交付和部署

对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。

2.2、更高效的虚拟化

Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。

2.3、更轻松的迁移和扩展

Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

2.4、更简单的管理

使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

具体就不介绍了 附上参考链接http://blog.51cto.com/ityouknow/2083688

3.常用命令

查看宿主机上的镜像,Docker镜像保存在/var/lib/docker目录下:

docker images

删除Docker镜像:

docker rmi id/name

如果系统提示下面语句 则是没开启docker :

开启命令:systemctl start docker

查看当前有哪些容器正在运行:

docker ps

查看所有容器:

docker ps -a

开启某个容器(例Redis):

docker run ‐di ‐‐name=容器名称 ‐p 6379:6379 redis

启动、停止、重启容器命令:

docker start container_name/container_id
docker stop container_name/container_id
docker restart container_name/container_id

删除容器的命令:

docker rm container_name/container_id

4.Spingboot

Springboot的包:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
        <relativePath/>
</parent>

Springboot连接数据库等 配置文件application.yml:

  application:  
    name: GuiSu-article #指定服务名
  datasource:  
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://ip:3306/表名?characterEncoding=UTF8
    username: root
    password: 123456
  jpa: 
    database: MySQL
    show-sql: true
  redis:
    host: ip(默认6379端口)

启动类:

@SpringBootApplication
public class BaseApplication {
    public static void main(String[] args) {
        SpringApplication.run(BaseApplication.class);
    }
    @bean
    这里可以添加相关bean
}

pojo层:

@Entity
@Table(name="映射表名")

@Id

Controllr层:

@CrossOrigin            //解决跨越问题
@RestController
@RequestMapping
@RequestBody @PathVariable

Service层:

@Service
@Transactional       //事务 一般增删改需要

Dao层:

SpringData-JPA:
//JpaRepository提供了基本的增删改查
//JpaSpecificationExecutor用于做复杂的条件查询
extends JpaRepository<对象,String>, JpaSpecificationExecutor<对象>

@Modifying
@Query(value = "sql语句",nativeQuery = true)

5.缓存技术

5.1SpringDataRedis

Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问
redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate
提供了redis各种操作。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐data‐redis</artifactId>
</dependency>

使用方法:

@Autowired
private RedisTemplate redisTemplate;


redisTemplate.opsForValue().set(k,v);  //可以设置过期时间 如设置一天(k,v,1,TimeUnit.DAYS)
redisTemplate.opsForValue().get(k);
redisTemplate.delet();

5.2Spring Cache

Spring Cache使用方法与Spring对事务管理的配置相似。Spring Cache的核心就是对某
个方法进行缓存,其实质就是缓存该方法的返回结果,并把方法参数和结果用键值对的
方式存放到缓存中,当再次调用该方法使用相应的参数时,就会直接从缓存里面取出指
定的结果进行返回。

与Spring-data-redis区别是:使用方便  但无法设置过期时间等

常用注解:

启动类@EnableCaching     //开启SpringBoot缓存
        
                                #参数    //可以拿到方法中的参数
@Cacheable(value="随便写",key="要存的id") //使用这个注解的方法在执行后会缓存其返回结果。
@CacheEvict    //使用这个注解的方法在其执行前或执行后移除Spring Cache中的某些元素。

6.文档型数据库MongoDB

简介:MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门 的一种。它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的产品。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存 储比较复杂的数据类型。
​MongoDB 的官方网站地址是:http://www.mongodb.org/

适用于:

MongoDB数据库特征:id必须是_id,否则不识别为id 

  • 数据量较大 
  • 价值较低(数据可以微量丢失)

安装(客户端+服务端):

配置系统环境变量

启动服务:mongod ‐‐dbpath=d:\MongoDBData

连接服务:mongod     默认连接本地,后面可跟ip地址实现远程连接

6.1Docker环境下安装MongoDB容器

docker run ‐di ‐‐name=tensquare_mongo ‐p 27017:27017 mongo
MongoDB常用命令:见第文档三章

6.2Java操作MongoDB

mongodb-driver是mongo官方推出的java连接mongoDB的驱动包,相当于JDBC驱动。
我们通过一个入门的案例来了解mongodb-driver的基本使用
引入依赖:

<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb‐driver</artifactId>
<version>3.6.3</version>
</dependency>
</dependencies>

创建测试类:

/**
* MongoDb入门小demo
*/
public class MongoDemo {
public static void main(String[] args) {
MongoClient client=new MongoClient("192.168.184.134");//创建连接
MongoDatabase spitdb = client.getDatabase("spitdb");//打开数据库
MongoCollection<Document> spit = spitdb.getCollection("spit");//获取集合
FindIterable<Document> documents = spit.find();//查询记录获取文档集合
for(Document document:documents){ 
System.out.println("内容:"+ document.getString("content"));
System.out.println("用户ID:"+document.getString("userid"));
System.out.println("浏览量:"+document.getInteger("visits"));
} 
client.close();//关闭连接
}
}

 查询 条件查询 插入数据等案例demo 详见次方第三章

6.3SpringDataMongoDB

SpringData家族成员之一,用于操作MongoDb的持久层框架,封装了底层的mongodbdriver。
官网主页: https://projects.spring.io/spring-data-mongodb/

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐data‐mongodb</artifactId>
</dependency>

dao层 extends MongoRepository可以实现简单增删改查  

7.SpringCloud

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简
化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、
熔断器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。

 7.1SpringCloud主要框架

7.2服务发现组件 Eureka 

  • 服务发现——Netflix Eureka
  • 服务调用——Netflix Feign
  • 熔断器——Netflix Hystrix
  • 服务网关——Netflix Zuul
  • 分布式配置——Spring Cloud Config
  • 消息总线 —— Spring Cloud Bus

           Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目
 spring-cloud-netflix中,实现SpringCloud的服务发现功能。Eureka包含两个组件:Eureka Server和Eureka Client。
           Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
​           Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就别一个内置的、使用轮(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。

7.3Eureka服务端开发
 

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
</dependencies>

添加application.yml
 

server:
  port: 6868
eureka:
  client:
    register-with-eureka: false   #需不需要把这个模块注册到eureka服务器
    fetchRegistry: false #是否从Eureka中获取注册信息
    service-url: #Eureka客户端与Eureka服务端进行交互的地址
      defaultZone: http://127.0.0.1:${server.port}/eureka/

在启动类上加@EnableEurekaServer注解

启动运行启动类,然后在浏览器地址栏输入 http://localhost:6868/ 运行效果如下
。。。。

主界面中system status为系统信息 General Info为一般信息 Instances currentlyregistered with Eureka为注册到的所有微服务列表
7.4服务注册

我们现在就将所有的微服务都注册到Eureka中,这样所有的微服务之间都可以互相调用了。
 

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

修改每个微服务的application.yml,添加注册eureka服务的配置
 

eureka:
    client:
        service-url:
            defaultZone: http://localhost:6868/eureka
    instance:
        prefer-ip-address: true

修改每个服务类的启动类,添加注解@EnableEurekaClient 使其注册到eureka中
启动测试:将每个微服务启动起来,会发现eureka的注册列表中可以看到这些微服务了
7.5Feign实现服务间的调用

Feign是简化Java HTTP客户端开发的工具(java-to-httpclient-binder),它的灵感来自于Retrofit、JAXRS-2.0和WebSocket。Feign的初衷是降低统一绑定Denominator到HTTP API的复杂度,不区分是否为restful

在需要的模块添加依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在启动类上增加如下2个注解:
@EnableDiscoveryClient    //发现服务
@EnableFeignClients       //采用feign的方式去发现服务

创建接口(与被调用的服务的方法及参数等需要相同,接口名称随意):

@FeignClient("tensquare‐base")
public interface LabelClient {
    @RequestMapping(value="/label/{id}", method = RequestMethod.GET)
    public Result findById(@PathVariable("id") String id);
}

@FeignClient注解用于指定从哪个服务中调用功能 ,注意里面的名称与被调用的服务名保持一致,并且不能包含下划线
@RequestMapping注解用于对被调用的微服务进行地址映射。注意 @PathVariable注解一定要指定参数名称,否则出错
 

再@Autowired注入调用即可

SpringCloud实现了负载均衡

7.6熔断器Hystrix

在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应。服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者”的不可用,并将不可用逐渐放大的过程。
A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者。A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,雪崩效应就形成了。

Hystrix [hɪst'rɪks]的中文含义是豪猪, 因其背上长满了刺,而拥有自我保护能力
Hystrix 能使你的系统在出现依赖服务失效的时候,通过隔离系统所依赖的服务,防止服务级联失败,同时提供失败回退机制,更优雅地应对失效,并使你的系统能更快地从异常中恢复。

 Feign 本身支持Hystrix,不需要额外引入依赖

 修改application.yml   开启hystrix熔断器
 

feign:
    hystrix:
        enabled: true

创建impl包,包下创建熔断实现类,实现自接口LabelClient  

@Component
public class LabelClientImpl implements LabelClient {
    @Override
    public Result findById(String id) {
    System.out.println("调用出错就会往这个实现类跳,这里可以写出错后的业务。。。熔断器触发!");
}
}

修改注解@FeignClient(value="tensquare‐base",fallback = LabelClientImpl.class)
 

7.7微服务网关

不同的微服务一般有不同的网络地址,而外部的客户端可能需要调用多个服务的接口才能完成一个业务需求。比如一个电影购票的收集APP,可能回调用电影分类微服务,用户微服务,支付微服务等。如果客户端直接和微服务进行通信,会存在一下问题:
# 客户端会多次请求不同微服务,增加客户端的复杂性
# 存在跨域请求,在一定场景下处理相对复杂
# 认证复杂,每一个服务都需要独立认证
# 难以重构,随着项目的迭代,可能需要重新划分微服务,如果客户端直接和微服务通信,那么重构会难以实施
# 某些微服务可能使用了其他协议,直接访问有一定困难
上述问题,都可以借助微服务网关解决。微服务网关是介于客户端和服务器端之间的中间层,所有的外部请求都会先经过微服务网关。

Zuul是Netflix开源的微服务网关,他可以和Eureka,Ribbon,Hystrix等组件配合使用。Zuul组件的核心是一系列的过滤器,这些过滤器可以完成以下功能:
# 身份认证和安全: 识别每一个资源的验证要求,并拒绝那些不符的请求
#审查与监控:
## 动态路由:动态将请求路由到不同后端集群
# 压力测试:逐渐增加指向集群的流量,以了解性能
# 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求
# 静态响应处理:边缘位置进行响应,避免转发到内部集群
# 多区域弹性:跨域AWS Region进行请求路由,旨在实现ELB(ElasticLoad Balancing)使用多样化
Spring Cloud对Zuul进行了整合和增强。使用Zuul后,架构图演变为以下形式

详细配置见微服务第8章!!

猜你喜欢

转载自blog.csdn.net/GuiSu97/article/details/86685659