SpringCloud微服务应用入门
微服务架构概述
单体应用架构的不足
所谓单体应用是指一个归档文件(如war文件)包含所有功能的应用,是一种应用广泛的传统项目架构,这种架构具有结构简单,部署方便的优点,当项目的规模不是很大,使用范围和并发量也都不是太大时,生产运转是比较平稳和正常的。但是,近些年随着移动互联应用的发展,项目呈现出应用场景丰富‘,规模、使用范围和并发量较大,单体应用架构的不足之处也越来越明显,主要有以下几方面:
- 复杂度高、维护困难、不易扩展、部署风险大;
- 项目采用的技术体系早已确定,新技术难以引入;
- 可靠性不高,任何一个问题都可能导致整个应用崩溃;
- 对高并发缺乏良好的支持。
认识微服务架构
为了解决单体应用架构的不足和问题,人们提出了微服务架构,这种微服务架构的基本思想是将一个大的应用系拆分成许多足够简单的小规模应用,每一个小应用就是一个微服务,每个微服务都独立开发和部署,与其它微服务没有直接关系,甚至每一个微服务使用的技术可以是不相同的。
微服务架构一般具有易于开发维护和部署、技术使用不受限制、可伸缩性好、可以实现高可靠高并发部署、具有负载均衡能力。
微服务架构的主要构成
一般微服务架构会包含以下组件。
- 服务发现组件:负责注册和查找服务组件;
- 若干服务组件
- 服务网关:负责接收和响应客户端请求,并提供服务路由;
- 负载均衡器;
- …
搭建SpringCloud微服务应用
在阅读本内容前,假设您已熟悉和掌握springboot方面知识和技能
开发eureka服务器(即服务发现组件)
-
创建maven项目(选择jar包)
-
在pom.xml中添加如下配置
<!-- 声明java版本和springcloud版本 --> <properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version> </properties> <!-- 继承springboot父项目 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <!-- 引入springboot开发工具 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!-- 引入eureka服务器 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <!-- 引入springcloud依赖的pom文件 此处与上述引入springboot父项目的效果一致,由于引入父项目的方式在pom中仅能出现一次,所以以这种方式引入 --> <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> <!-- springboot maven 构建插件 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
-
在application.yaml中配置如下
server: port: 8761 eureka: client: register-with-eureka: false #当有多个eureka实例进行高可靠部署时,这里应当配置为true,即当前eureka实例做为其它eureka实例的客户端,并在其它eureka上注册 fetch-registry: false #当有多个eureka实例进行高可靠部署时,这里应当配置为true,即当前eureka实例从其它euraka上获同步获取注册信息 service-url: defaultZone: http://localhost:8761/eureka/ #设置eureka服务器的访问地址,在浏览器上访问eureka时地址栏上应当输入http://localhost:8761
-
开发主启动类
SpringBootApplication @EnableEurekaServer //此注解说明本应用为eureka服务器 public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } }
-
启动应用,在浏览器上访问http://localhost:8761,测试。
开发服务组件
服务组件根据项目需要可以开发多个,所有的服务组件都应当作为eureka客户端在eureka上进行注册。这里以一个服务组件作为示例。
-
创建maven项目(选择jar包)
-
在pom.xml中添加如下配置
<properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!-- 引入web支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 引入eureka客户端支持 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </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>
-
在application.yaml中配置如下
server: port: 8081 logging: level: root: info web: trace spring: application: name: my-service #注册在eureka上的服务名 eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ #配置注册访问eureka到标准 instance: prefer-ip-address: true #将客户端ip地址注册到eureka上,而默认将客户端主机明注册到eureka上
-
开发主启动类
@SpringBootApplication
public class MyServiceApplication {
public static void main(String[] args) {
SpringApplication.run(MyServiceApplication.class, args);
}
}
- 开发控制器
@RestController
public class MyServiceController {
@RequestMapping("/s1")
public String s1() {
return "我是服务One!";
}
@RequestMapping("/s2")
public Map<String,Object> s2() {
Map<String , Object> map = new HashMap<String,Object>();
map.put("id", "001");
map.put("name", "名称");
map.put("salary", 8800);
return map;
}
}
- 测试
启动应用,通过浏览器访问eureka,观察标题Instances currently registered with Eureka下到服务实例列表,是否存在MY-SERVICE,若存在说明注册成功。
接下来,在浏览器上通过地址http://localhost:8081/s1 或者 http://localhost:8081/s2 访问服务是否可以获取数据。
开发zuul(网关组件)
网关组件运行后,所有的请求不必直接访问服务组件,而是可以通过网关代理,网关将做为客户端与服务端到统一交互界面。
网关也是一个eureka到客户端组件,亦需在服务器上注册。
-
创建maven项目(选择jar包)
-
在pom.xml中添加如下配置
<properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!-- 引入对zuul网关到支持 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </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>
-
在application.yaml中配置如下
server:
port: 9999
logging:
level:
root: info
spring:
application:
name: my-zuul
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
-
开发主启动类
@SpringBootApplication
@EnableZuulProxy //声名一个zuul代理(网管)
public class ZuulApplication {public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
- 启动网关组件,进行测试
访问服务到路由规则为:http://<zuul主机地址>:<zuul端口号>/在eureka上注册到服务名明/**
示例:http://localhost:9999/my-service/s1
案例源码地址
来源:CSDN
作者:夏冬琦
链接:https://blog.csdn.net/serdonty/article/details/103447344