只是作者的个人简介,了解的也不是很全面,我会根据自己在此方面的积累不断完善,还请各位批评指正。

一、什么是微服务、不用他到底能不能行?

首先你会得到一个肯定的答案:不用他也能行,也能完成最基础的软件工程开发。
据老师所言,微服务的好与坏在许多程序员的口中都展现了不同的状态,打的不可开交。抱着一颗学习的心态去冲就完事,毕竟大佬大家,小白遭殃,我们不知道之后的软件开发场景是否会被微服务所替代,毕竟设计人员很喜欢他,也不知道之后是否还会被其他框架所代替,毕竟程序员会嫌他烦,废话少说我们进入正题

  • Spring Cloud是目前最流行的进行微服务架构的框架之一,是一个一站式的开发分布式系统的框架,为开发者提供了一系列的构建分布式系统的工具集。目前已经在各大互联网公司得到广泛应用,是进行微服务架构的优先选择工具,也是程序员进阶和架构师必备的技术。你可以把他简单理解成一个框架,向ORM那样,能够针对某种诉求,完成某种操作。

定义开起来确实枯燥无味,不妨听我讲一个日常生活中的业务场景,也许你就可以了解到他的强大之处了。

一个公司现在具备多套由不同公司或相同公司开发的系统,他们可以是员工管理系统、考勤管理系统、学习管理系统等等。这些系统是根据本公司的发展逐步增加出来的,也就是说在一开始老板并不清楚我究竟需要哪些系统。当这些系统逐步开发出来之后,问题也就随之而来了。

  1. 我现在有多套系统,并且每个系统都配备了账号,每个系统都是单独一个库。也就意味着用户需要频繁的注册账号然后写入密码,随着系统的不断增多,用户的体验效果会变得越来越不好,当然,如果说这些系统不存在相互之间的交互,每个人就单独使用一两个还能接受。如果许多数据都一样,为了增加用户体验感和效率,我们该怎么办。
  2. 就比如说员工管理系统,他详细的记录了每一个员工的信息,学习管理系统记录了每个人该学哪些部分,当公司老板想要去知道那些人该学的内容没学习,学习了多长时间的时候,我们会发现,如果说我不注册账号,我就不学习,信息管理人员就要从两个系统中分别取出需要的部分,然后在整理。这样会大大降低效率,更有的人会说我们可以在考勤管理人员中提前建立好员工信息,这样不就可以了,那对于我们想满足此场景,我们是不是势必会造成大量的数据冗余。

以上两个简单的业务诉求是我们很常见的问题,两个系统之间的数据不能互相访问,产生了数据孤岛
解决这样的问题其实有很多途径,比如:

  1. 对现有主题系统进行二次开发,将两个系统融合成一个系统。(如果系统少,还好说,如果该公司的系统非常多,那我们该怎么办,一次次的迭代?很显然不是明智的办法)
  2. 保留原有的系统,分别开放HTTP接口,让其他系统能够访问其他库。(如果说单纯的查询,那么没问题,很简单。如果说是进行了多库的增、删、改呢?比如当我在进行到第三个库时出错时,我们前两个库的数据是否还会被保存?整个操作算成功还是失败?如果是失败,是不是还需要在书写对应的补偿机制删除之前错误的插入)

显然,还有很多类似的场景没有举出,但已经能够陈述出微服务的优点了。Google也曾为了解决类似的问题,专门造出一个平台能够提供各种网络访问,实现最基本的安全验证。把系统上传到本平台上。开放端口,这样维护平台的安全性就可以了。saas,服务及软件。pass平台及服务(B2B租户的模式)也许就是这样的模式。

二、微服务常识(不全面,会慢慢更新)

据作者了解目前主流的微服务有三套:

  1. spring原生
  2. 阿里巴巴(个人觉得没有原生做的好,但封装了很多接口,大家可以积极尝试)
  3. 华为(大部分借鉴了原生,通信方面做的好,如果有通信要求,可以采用他)

服务发现:把服务名称注册出去。
服务网关,gatway 负载均衡
微服务安全
1.菜单可见性维护安全。
2.后端加安全拦截
​ 1)看结构,如果部署服务网关上公网,但是服务不上公网,去拦截服务网关就行
​ 2)服务都上公网。每一个服务的每一个接口都需要拦截。

三、启动一个微服务项目

  1. 创建Eureka服务
  • 创建标准boot工程,具体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>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.5.1</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.zhisen.cslcp</groupId>
	<artifactId>eureka-server</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>eureka-server</name>
	<description>cslcp</description>
	<properties>
		<java.version>1.8</java.version>
		<spring-cloud.version>2020.0.3</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>
		</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>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

或者直接在官网上创建一个springboot工程
在这里插入图片描述

  • yml配置文件如下:

系统启动会爆出8761注册错误,但实际上eureka服务器已经启动成功了。可以使用10001来访问注册的服务器。出现错误的原因是,eureka服务器在启动的时候默认是将自己做为客户端继续注册到其他的服务器中,这样达到高可用的状态。可以通过配置暂时关闭掉这一特性。

server:
  port: 10001
spring:
  application:
    name: eureka-server

eureka:
  instance:
    hostname: 172.16.122.38
  client:
    hostname: 172.16.122.38
    register-with-eureka: false
    fetch-registry: false
    serviceUrl:
      defaultZone: http://127.0.0.1:10001/eureka/

在这里插入图片描述

  1. 向Eureka注册服务
  • 创建一个普通的spring boot工程,在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>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.5.1</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.zhisen</groupId>
	<artifactId>cslcp-1</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>cslcp-1</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
		<spring-cloud.version>2020.0.3</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>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.76</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</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>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

在这里插入图片描述

  • yml配置文件如下:
    向集群中添加服务
    理论上向集群中的一个节点添加服务,集群中的其他eureka都会自动注册该服务,但实践中建议向所有的服务器去注册服务
server:
  port: 10002

spring:
  application:
    name: cslcp-1

eureka:
  instance:
    hostname: 172.16.122.38
  client:
    hostname: 172.16.122.38
    serviceUrl:
      defaultZone: http://172.16.122.38:10001/eureka/

在这里插入图片描述
制作整理不易,以上内容均为原创(参考了部分官方文档和老师整理的案例)。如要引用请附上本文链接,如有疑问可以在评论区畅所欲言,作者看到会第一时间回复,欢迎交流!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐