利用 Maven 构造 Spring Cloud 微服务架构 模块使用 spring Boot构建
采用Maven 聚合工程搭建 Spring Cloud
使用工具:
IntelliJ IDEA 版本: 2019.2.2
maven 版本: 3.6.0
JDK 版本:1.8.0_181
1、搭建聚合工程的父模块
2、配置父模块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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.hai.cloud</groupId>
<artifactId>haiSpringCloud</artifactId>
<description>this project is haiSpringCloud</description>
<name>haiSpringCloud</name>
<version>1.0.0</version>
<packaging>pom</packaging><!-- 父类型都为pom类型 父模块是用于 子模块继承, 一处声明,多处使用,因此packaging是pom --> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath/>
</parent> <properties>
<java.version>1.8</java.version>
<project.build.soutceEncoding>UTF-8</project.build.soutceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-cloud.version>Hoxton.SR4</spring-cloud.version>
</properties> <!-- 设定主仓库路径 会按照设定顺序去查找-->
<repositories>
<!-- 阿里中央仓库 首选-->
<repository>
<id>alimaven</id>
<name>aliyum maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</repository>
</repositories>
<!-- 设置仓库插件路径 -->
<pluginRepositories>
<pluginRepository>
<id>alimaven</id>
<name>aliyum maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</pluginRepository>
</pluginRepositories> <dependencies>
<!--下面的web、test在spring boot 生态中成为Starter POMs,是一套一站式spring相关技术解决方案,starter POMs采用spring-boot-starter-*的命名方式,如:spring-boot-starter-jdbc-->
<!-- 全栈Web开发模块,包含嵌入式的Tomcate、Spring MVC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency> <!-- 引入log4j2依赖 spring boot 用log4j2-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency> <!-- 通用的测试模块,包含JUnit、Hamcrest、Mockito -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency> <!-- 热部署模块
devtools 监听classpath下的文件变动,并会立即重启应用,采用的是虚拟机机制,so重启很快
注意:(1)base classloader (Base类加载器) 加载不改变的class,例如第三方提供的jar
(2) restart classloader(Restart类加载器) 加载正在开发的Class
重启之所以很快是因为只加载了开发的Class,没有重新加载第三方的jar -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope><!-- 这个需要为 true 热部署才有效 -->
<optional>true</optional><!--optional=true 依赖不会传递,该项目依赖devtools-->
</dependency> <!-- 用于监控端点 (运维监控)
添加该配置,控制台会有以下内容输出: o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator'
访问http://localhost:8081/actuator 就可以获得该应用的各项监控指标 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency> <!--阿里 FastJson依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.68</version>
</dependency> <!-- 启用注解读取配置文件支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency> </dependencies> <!-- dependencyManagement 标签不会引入依赖 -->
<dependencyManagement>
<dependencies>
<!-- spring-cloud 版本 -->
<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> <!-- spring-boot-maven-plugin插件可以方便的启停应用, 通过 mvn spring-boot:run 命令快速启动Spring Boot应用 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<environmentVariables>
<encoding>UTF-8</encoding>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<verbose/>
<!-- windows下使用分号(;)分隔,linux/mac下使用冒号(:)分隔 -->
<bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</bootclasspath>
</compilerArguments>
</environmentVariables>
</configuration>
</plugin>
</plugins>
</build> </project>
3、创建Spring Cloud 核心模块, Eureka注册中心
3.1 通过spring Boot 搭建Eureka注册中心
3.2、由于这是一个子模块,需要继承父模块,修改pom.xml
在父模块pom.xml中添加hai-uereka模块
<modules>
<module>hai-eureka</module>
</modules>
3.3、修改resources/application.properties为application-dev.yml (Spring Boot 支持 .properties 和 .yml 个人喜欢用yml,这个不改也可以),添加以下配置
#ָ指定应用名 在spring Cloud 中会被注册为服务名
spring:
application:
name: hai-eureka
profiles:
active: dev #指定端口
server:
port: 8760 eureka:
server: # 详见 org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean
enable-self-preservation: false #关闭保护机制 eureka 当心跳失败率大于85%就会触发自我保护,Eureka Server不剔除已关停的节点,这里关闭eureka保护机制
eviction-interval-timer-in-ms: 10000 #设置清理无效节点的时间间隔,毫秒单位(默认是60秒),这里修改为10秒
peer-eureka-nodes-update-interval-ms: 1000
wait-time-in-ms-when-sync-empty: 0
instance:
hostname: localhost
client: # 详见 org.springframework.cloud.netflix.eureka.EurekaClientConfigBean
register-with-eureka: false #eureka默认既可以做服务端也可以做客户端, 由于该应用为注册中心,所以设置为false,代表不向注册中心注册自己
fetch-registry: false #注册中心的职责就是维护服务实例,他并不需要去检索服务,所以也设置为false
eureka-server-total-connections: 200 # 总连接数,默认200
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
3.4 在启动类添加 @EnableEurekaServer,开启服务注册功能
3.5修改启动配置,指定dev环境 (-Dspring.profiles.active=dev)并启动
接下来就是见证奇迹的时刻了,用浏览器打开 http://localhost:8760 , 访问成功
Spring Cloud 核心组件 注册中心已经搭好了,这会就可以喝点东西休息休息啦
4、接下来就该创建服务提供者,注册到Eureka注册中心去
4.1 还是用Spring Boot 创建 创建 子模块
4.2 修改producer 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>com.hai.cloud</groupId>
<artifactId>haiSpringCloud</artifactId>
<version>1.0.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.hai.cloud</groupId>
<artifactId>producer</artifactId>
<version>1.0.0</version>
<name>producer</name>
<description>producer project for Spring Boot</description> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency> </dependencies> </project>
4.3 修改 application.properties 为application-dev.yml ,添加以下配置
# 指定应用名 在spring Cloud 中会被注册为服务名
spring:
profiles:
active: dev
application:
name: hai-producer
server:
port: 8081 eureka:
client:
register-with-eureka: true #该应用作为客户端 向eureka 注册 服务 默认是 true
fetch-registry: true # 允许检索服务 默认是 true
serviceUrl:
defaultZone: http://localhost:8760/eureka/
instance:
#prefer-ip-address: true 我这里用的是 hostname 使用IP 需要设置该项为 true
hostname: localhost
lease-renewal-interval-in-seconds: 30 # 服务续约任务的调用时间间隔, 单位秒, 默认30s
lease-expiration-duration-in-seconds: 90 # 服务失效时间,单位秒 默认90s
4.4 修改启动,添加 @EnableDiscoveryClient
4.5、创建controller ,写个测试接口,打印一些服务信息
package com.hai.cloud.producer.controller; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.composite.CompositeDiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; /**
* @program: haiSpringCloud
* @description: 用户相关控制类
* @author: lizhihai
* @create: 2020-05-04
*/
@RestController
public class UserController { Logger log = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME); /**
* 高版本的 spring cloud 需要用CompositeDiscoveryClient 通过serverid获取instance对象
*/
@Autowired
CompositeDiscoveryClient discoveryClient; @RequestMapping(value = "/index", method = RequestMethod.GET)
public String index(){
//打印服务信息
this.stuServerInfo("/index");
return "Hello World";
} /**
* @Description: 打印服务信息
* @Param: path 接口路径
* @Author: lizhihai
* @Date: 2020/5/4
*/
public void stuServerInfo(String path){
//获取serviceId
String serviceId = discoveryClient.getServices().get(0);
//通过 serceId获取Instance对象
ServiceInstance instance = discoveryClient.getInstances(serviceId).get(0);
log.info("HOST==>" + instance.getHost());
log.info("SERVICEID==>" + instance.getServiceId());
log.info("INSTANCEID==>" + instance.getInstanceId());
log.info("URL==>" + instance.getUri() + path);
}
}
4.6 、配置启动项 ,指定环境变量 -Dspring.profiles.active=dev, 并启动
再次访问http://localhost:8760 就会发现application多了一条数据,可以与我前面的截图对比
5、创建消费者模块
流程和上面的一样
在启动类中添添加@EnableDiscoveryClient 并添加以下方法
/**
* @Description: RestTemplate 会使用Ribbon 的自动化配置
* 通过LoadBalanced 可以开启客户端的负载均衡
* @Author: lizhihai
* @Date: 2020/5/13
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
创建一个Controller,通过服务名调用producer 的接口
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; /**
* @program: haiSpringCloud
* @description: 服务消费
* @author: lizhihai
* @create: 2020-05-13
*/
@RestController
public class ConsumerController {
@Autowired
RestTemplate restTemplate; /**
* @Description: 通过Ribbon 调用无参的GET请求 除了 getForEntity 还有 getForObject 、
* 调用SPRING-BOOT-PRODUCER 服务的index接口
* @Author: lizhihai
* @return: ResponseEntity对象是Spring对HTTP请求响应的封装,其中包括:HttpStatus(404、500) 、 HttpEntity 、 HttpHeaders
* @Date: 2020/5/13
*/
@RequestMapping(value = "/indexConsumer1", method = RequestMethod.GET)
public ResponseEntity<String> indexConsumer1(){
ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://HAI-PRODUCER/index", String.class);
return responseEntity;
}
}
以9001端口启动,
注册中心多了一条application
访问 localhost:9001/indexConsumer1 如下:
HAI-PRODUCER 服务控制台输出
我们前台调用 localhost:9001/indexConsumer1, 通过注册中心调用了 HAI-PRODUCER/index 接口
到这里就打工告成了
利用 Maven 构造 Spring Cloud 微服务架构 模块使用 spring Boot构建的更多相关文章
- Dubbo和Spring Cloud微服务架构比较
Dubbo 出生于阿里系,是阿里巴巴服务化治理的核心框架,并被广泛应用于中国各互联网公司:只需要通过 Spring 配置的方式即可完成服务化,对于应用无入侵,设计的目的还是服务于自身的业务为主. 微服 ...
- Dubbo 和 Spring Cloud微服务架构 比较及相关差异
你真的了解微服务架构吗?听听八年阿里架构师怎样讲述Dubbo和Spring Cloud微服务架构. 微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务, ...
- Spring Cloud 微服务架构解决方案
1 理解微服务 1.1 软件架构演进 软件架构的发展经历了从单体结构.垂直架构.SOA架构到微服务架构的过程. 1.1.1 单体架构 特点: 1.所有的功能集成在一个项目工程中. 2.所有的功能打一个 ...
- 一张图了解Spring Cloud微服务架构
Spring Cloud作为当下主流的微服务框架,可以让我们更简单快捷地实现微服务架构.Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟.经得起实际考验的服务框架组合起来 ...
- 全链路实践Spring Cloud 微服务架构
Spring Cloud 微服务架构全链路实践Spring Cloud 微服务架构全链路实践 阅读目录: 网关请求流程 Eureka 服务治理 Config 配置中心 Hystrix 监控 服务调用链 ...
- 【spring colud】spring cloud微服务项目搭建【spring boot2.0】
spring cloud微服务项目搭建 =================================== 示例版本: 1.spring boot 2.0版本 2.开发工具 IntellJ IDE ...
- Spring Cloud 微服务四:熔断器Spring cloud hystrix
前言:在微服务架构中,一般都是进程间通信,有可能调用链都比较长,当有底层某服务出现问题时,比如宕机,会导致调用方的服务失败,这样就会发生一连串的反映,造成系统资源被阻塞,最终可能造成雪崩.在sprin ...
- Dubbo和Spring Cloud微服务架构'
微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...
- Spring Cloud 微服务架构的五脏六腑,统统晒一晒!
Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 注:Spring Boot 简单理解就是简化 Spring 项目的搭建.配置.组 ...
随机推荐
- 利用浏览器的console篡改cookie
背景: 最近公司有个客户问题,是由于浏览器的cookie中多记录过期的session id导致重复登录,普通操作无法复现,因此尝试进行cookie篡改复现问题. 方法: 首先,要知道软件定义的sess ...
- B - Fadi and LCM CodeForces - 1285C 质因子
题目大意很简单,给你一个整数X,让你求a和b,使得max(a,b)尽可能的小,然后打印a,b 题解:想到了质因子分解,也考虑到了暴力,但是觉得暴力的话会TLE,所以打算用贪心做,然后就一直Wa.... ...
- 【考试总结】欢乐模拟赛_Day1
\(T1\) 题目描述 给出一个 \(n × n\) 的, 元素为自然数的矩阵. 这个矩阵有许许多多个子矩阵, 定义它的所有子矩阵形成的集合为 \(S\) . 对于一个矩阵 \(k\) , 定义 \( ...
- 词向量表示:word2vec与词嵌入
在NLP任务中,训练数据一般是一句话(中文或英文),输入序列数据的每一步是一个字母.我们需要对数据进行的预处理是:先对这些字母使用独热编码再把它输入到RNN中,如字母a表示为(1, 0, 0, 0, ...
- SpringMVC视图解析中的 forward: 与 redirect: 前缀
在 SpringMVC 中,可以指定画面的跳转方式.使用 forward: 前缀实现请求转发跳转,使用 redirect: 前缀实现重定向跳转.有前缀的转发和重定向操作和配置的视图解析器没有关系,视图 ...
- C# 反射(一)
刚工作没多久,需要对以往的知识进行复习和巩固.先讲讲最近在公司常用到的反射机制. 反射(Reflection):提供了封装程序集.模块和类型的对象(Type 类型).可以使用反射动态创建类型的实例,将 ...
- vue中解决时间在ios上显示NAN的问题
最近在用vue,遇到倒计时在ios上显示为NAN的问题. 因为做的是倒计时支付,思路是获取服务器时间和下单时间,再转成秒级时间戳做差值. 在网上找到说是ios 不支持例如2018-09-01 10:0 ...
- CSS躬行记(7)——合成
在图形编辑软件中,可以按特定地方式处理不同图层的合成,最新的CSS规范也引入了该功能,并提供了mix-blend-mode和background-blend-mode两个属性.混合模式(blendin ...
- python爬虫——用selenium爬取京东商品信息
1.先附上效果图(我偷懒只爬了4页) 2.京东的网址https://www.jd.com/ 3.我这里是不加载图片,加快爬取速度,也可以用Headless无弹窗模式 options = webdri ...
- vector做形参时的三种传参方式
vector在做形参的时候传参的方式和普通的变量是一样的,要么传值.要么传引用.要么传指针. 现在分别定义三个以vector为形参的函数: (1) fun1(vector <int> v) ...