文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

微服务之SpringCloudNetfix应用框架搭建详解

2024-12-13 16:05

关注

SpringCloud是目前微服务转型的首选,主要得益于其活跃的社区支持度以及全量的配套组件,本章笔者将会把SpringCloud Netfix的几个核心组件组合起来,和老铁们一起逐步完成全套的应用框架搭建,这样有需要的老铁们在项目中就可以直接使用啦。

在SpringCloud Netfix中,核心的组件包括:注册中心(Eureka)、负载均衡(Ribbon)、服务调用(Feign)、熔断及降级(Hystrix)、网关(Gateway)、配置中心(Config)、链路追踪(Sleuth)等几大组件。

我们都知道SpringCloud是基于SpringBoot整出来的微服务框架,换言之在开发SpringCloud微服务的时候,咱就少不了要使用SpringBoot,所以这里的整合SpringCloud也就遵循了SpringBoot的某种整合的规范,比如对于依赖的引用就遵守:spring-cloud-starter-xxx这种规范,这里的xxx指的就是咱们使用的组件,比如如果咱们需要整合Ribbon,那它的依赖名称就是spring-cloud-starter-netflix-ribbon。

首先笔者将应用的整体情况做如下介绍:

1.应用的整体架构图:

2.使用的SpringCloud的版本是Hoxton.SR9,老铁们可以根据自己需要选择版本。

3.微服务的代码层级关系

其中parent为所有模块的父依赖,主要管理公共依赖;common是各个模块都需要用到的一些通用类;springcloud-demo-eureka-service则是eureka注册中心以及配置中心;global-gateway是网关;order-demo和product-demo是具体的服务。

4.JDK版本笔者用的是JDK1.8。

5.需要提前下载zipkin服务,下载地址大家到网上搜,下载后执行:java -jar zipkin.jar启动即可,然后访问:http://localhost:9411/zipkin/看看能否正常访问,正常情况下访问显示如下:

6.登录到Github上,创建一个服务,比如笔者这里创建了springcloud-demo-config的服务,用于存放配置文件。

7.启动顺序:注册中心和配置中心->服务提供者->消费者->网关。

接下来就看每个模块的代码了:

1.parent

parent的主要作用是管理公共的依赖,核心就是一个pom.xml文件,需要注意的是,它的parent是spring-boot-starter-parent:   

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.6.RELEASE</version>
</parent>
<groupId>my.springcloud.demo</groupId>
<artifactId>parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<java.version>8</java.version>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
</properties>
<modules>
<module>product-demo</module>
<module>springcloud-demo-eureka-service</module>
<module>order-demo</module>
<module>springcloud-demo-eureka-service2</module>
<module>common</module>
<module>global-gateway</module>
</modules>
<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>my.springcloud.demo</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

2.eureka+config

该模块主要是注册中心和配置中心。

2.1.依赖

它主要的两个依赖是spring-cloud-config-server和spring-cloud-starter-netflix-eureka-server。

<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-server</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>

2.2.配置文件

它的配置文件application.properties如下:

server.port=8761
spring.application.name=springcloud-demo-eureka-service
#最好取个名字,方便区分
eureka.instance.instance-id=springclouddemo1.com
#false不注册自己,当然也可以设置为true,注册自己
eureka.client.register-with-eureka=false
#config服务使用git存储数据,这里配置git仓库的地址
spring.cloud.config.server.git.uri=https://github.com/xxxx/springcloud-demo-config.git
spring.cloud.config.server.git.username=xxxxxx@126.com
spring.cloud.config.server.git.password=xxxxxxxx
#指定仓库分支
spring.cloud.config.server.git.default-label=master
eureka.instance.prefer-ip-address=true

2.3.启动类注解

在启动类上增加三个注解:@EnableEurekaServer、@SpringBootApplication、@EnableConfigServer。

3.网关

网关作为应用的入口,它的主要作用就是请求转发、统一验证、路由、限流等,这里我们通过网关向后台应用转发。作为访问的入口,网关同时也应该是调用链路的发起者。

3.1.依赖


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

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

3.2.在配置文件bootstrap.yml中指定配置服务

spring:
application:
name: global-gateway
cloud:
config:
uri: http://localhost:8761
label: master

3.3.远程仓库配置文件

这里我们使用的是配置中心的远程配置,所以在Git仓库的springcloud-demo-config.git应用下,添加网关的配置文件:global-gateway-${active}.properties,指定注册中心、zipkin的地址,同时配置网关自动发现,内容如下:

spring.application.name=global-gateway
server.port=9006
eureka.client.fetch-registry=true
eureka.client.register-with-eureka=true
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
#配置网关自动发现
spring.cloud.gateway.discovery.locator.enabled=true
spring.zipkin.base-url=http://localhost:9411/
spring.sleuth.sampler.probability=1

3.4.启动类注解

然后在启动类上添加如下注解:

@SpringBootApplication

@EnableDiscoveryClient

通过网关访问时,指定服务名和服务URL,如:

​http://localhost:9006/ORDER-DEMO/order/getOrder?id=1​

4.商品服务

作为具体的服务提供者,它需要往注册中心注册服务;同时需要从配置中心读取配置文件,也就是作为配置服务的客户端;上报调用链路数据。

4.1.依赖

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

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

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

4.2.在配置文件bootstrap.yml中指定配置服务

spring:
application:
name: product-demo
cloud:
config:
uri: http://localhost:8761
label: master

4.3.远程仓库配置文件

这里我们使用的是配置中心的远程配置,所以在Git仓库的springcloud-demo-config.git应用下,添加商品服务的配置文件:product-demo-${active}.properties。

spring.application.name=product-demo
eureka.instance.instance-id=productdemo
eureka.instance.hostname=localhost
server.port=8080
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
management.endpoint.info.enabled=true
management.endpoints.web.exposure.include=*
management.endpoint.health.enabled=true
management.endpoint.health.show-details=always
management.endpoint.shutdown.enabled = true
info.app.name=productDemo
info.company.name=test
info.test.tt=this is product
spring.zipkin.base-url=http://localhost:9411/
spring.sleuth.sampler.probability=1

4.4.启动类注解

如果需要开启熔断,则需要在启动类上增加注解:SpringBootApplication和EnableCircuitBreaker。

5.订单服务

同商品服务类似,它需要消费商品服务。作为服务的消费者,它需要往注册中心注册服务,同时需要从注册中心同步服务信息;同时需要从配置中心读取配置文件,也就是作为配置服务的客户端;上报调用链路数据。

5.1.依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
熔断依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
调用链路依赖-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

5.2.在配置文件bootstrap.yml中指定配置服务:

spring:
application:
name: order-demo
cloud:
config:
uri: http://localhost:8761
label: master

5.3.远程仓库配置文件

这里我们使用的是配置中心的远程配置,所以在Git仓库的springcloud-demo-config.git应用下,添加商品服务的配置文件:product-demo-${active}.properties。

spring.application.name=order-demo
server.port=8081
eureka.instance.hostname=localhost
eureka.instance.instance-id=orderdemo
management.endpoint.info.enabled=true
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000
#zipkin
spring.zipkin.base-url=http://localhost:9411/
spring.sleuth.sampler.probability=1

5.4.启动类注解

如果需要开启熔断,则需要在启动类上增加注解:

@SpringBootApplication

@EnableHystrix

如果微服务调用使用Feign,则还需要增加@EnableFeignClients注解,并且添加接口,同时在接口上添加FeignClient注解,如笔者这里将调用PRODUCT-DEMO服务:

@FeignClient("PRODUCT-DEMO")
public interface ProductFeignService {
@RequestMapping("/product/getProduct")
public Product getProduct(@RequestParam(value="id") Integer id);
}

当然如果是想使用Ribbon调用,则需要在配置类中增加如下代码:

@Bean
@LoadBalanced
public RestTemplate createRestTemplate(){
return new RestTemplate();
}

使用时,直接通过如下注解方式直接注入即可使用:

@Autowired
private RestTemplate restTemplate;

然后编写其他代码,完成服务之间的调用,这里笔者想对熔断的使用啰嗦两句,发送熔断的地方有两个:一个是服务提供方,当服务出现异常情况时,服务本身可以触发熔断,直接返回统一的错误;另外一个是消费方,这种情况下熔断有了另外一个名词,也叫降级,一般是服务方不能正常提供服务,比如访问超时,或者主动断开服务的情况下,消费方做出的反应,这种压根就不会向服务提供方发起请求。

所有代码完成后,以此启动,然后通过网关访问,然后登录http://localhost:9411/,可以查看整体的调用依赖和调用链路信息,至此整体搭建完成。

作者介绍

波哥,互联行业从业10余年,先后担任项目总监及架构师。目前专攻技术,喜欢研究技术原理。技术全面,主攻java,精通JVM底层机制及Spring全家桶底层框架原理,熟练掌握当前主流的中间件、服务网格等技术原理。

来源:51CTO内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯