微服务学习(第二篇)-微服务实例

一个微服务实例


创建两个模块:micro-provider:服务提供者,micro-consumer:服务消费者
其中micro-consumer可以有多个,同事去消费。

1、常见micro-provider的工程:

1.1、引入相关的依赖如下在这里插入图片描述1.2、配置一些属性的配置信息:在这里插入图片描述1.3、提供一个domain的UserInfo的实体类:用户信息在这里插入图片描述类的结构就是get和set方法的结构在这里插入图片描述1.4、提供一个mapper的接口:在这里插入图片描述1.5、在主类里面加上MapperScan的注解,去把mapper接口生成的代理实现类去交给Spring容器管理。在这里插入图片描述1.6、由于接口会形成映射的,由于是单表操作的就不去写xml文件了。直接用注解的方式,代码如下:在这里插入图片描述1.7、新建一个service接口和实现类,代码如下:在这里插入图片描述1.8、新建一个controller,由于provider是要提供服务的。由于服务是rest风格的。所以说在spring4.3以后出现一个统一接口的注解@RestController 在这里插入图片描述上面就是一个简单的springBoot应用就搭建成功了。

1.9、运行下上面的应用:在这里插入图片描述访问的结果如下 :是一个json的格式。因为它默认是使用jackson来序列化对象的

restAPI来源于controller里面提供的路径。SpringBoot是一个入门的微框架。springBoot的项目就可以称之为简单的微服务应用

2、在建一个micro-consumer的springBoot项目,因为它相当于一个前端的应用,所以依赖只要是一个web就可以了。既然是前端的服务,只需要提供json字符串就可以了。

2.1、新建一个vo->userVo的实体类用于给前台展示的,代码如下:在这里插入图片描述2.2、在微服务中应用通信的两种方式

A、RestTemplate

写一个配置类来获取RestTemplate对象,代码如下:

package com.boot.micro.demo.microconsumer.config;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootConfiguration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}

客户端通过RestTemplate的一个模板完成了对rest风格的调用,代码如下:

package com.boot.micro.demo.microconsumer.controller;
import com.boot.micro.demo.microconsumer.vo.UserVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class UserWrapController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("warp/user/{id}")
public UserVo getUser(@PathVariable("id") Integer userId){
return restTemplate.getForObject("http://localhost:8080/user/"+userId,
UserVo.class);
}
}

现在运行下客户端,然后访问下:在这里插入图片描述vo的实体类中的字段也可以不和提供服务的项目中的实体类的属性一样也可以,只要能够映射成一样就可以,代码如下在这里插入图片描述再次运行下:在这里插入图片描述提问:如果micro-provider部署了三台服务器的话,客户端来调用,到底调用的是哪一个呢?这就涉及到了,多服务实例部署的时候就涉及到了负载均衡。所以说上面的方式是做不了负载均衡的。

负载均衡:让很多的实例去减少原有服务的压力然后把它做成了多个节点部署了多个节点,从而减少原有一个服务实例的压力。能力越强的承担的越大。

如果想要做负载均衡的话,需要把micro-provider定义一个应用名称:
在这里插入图片描述然后把micro-provider配置三台:在这里插入图片描述在这里插入图片描述在这里插入图片描述把上面的三个微服务的实例给启动起来:在这里插入图片描述如果想要做负载均衡的话,用上面的方式是不行的,因为端口不一样了,上面的方式是写死的方式的。如果想要做负载均衡的话,必须引入一个负载均衡框架,这三个微服务实例是有注册的。然后客户端才能去发现的。需要有一个路由,来路由上面的三个微服务实例的才行。

1、加入服务注册中心,要把服务发现组件加进来才行,需要把服务的地址放到服务注册中心上去。正常的情况是客户端去访问哪一个服务端的地址是不知道的,而且为了保证服务端的的安全,不可能把服务端的ip地址告诉客户端。zookeeper其实是一个协调服务的一个组件。没有什么具体业务功能的实现。在zk中有watcher机制(有点类似于javaWeb中的监听器)和节点类型

下面的图是发布和订阅的模式。客户端去服务注册中心去提取列表,然后去做整个的负载均衡。

在这里插入图片描述1、引入springCloud的依赖管理:

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

2、引入zookeeper

<!--引入zookeeper-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-all</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.12</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>

3、配置zookeeper:
在这里插入图片描述4、如果想要被客户端发现的话,需要加上一个注解:在这里插入图片描述5、然后分别去启动下服务端的三个实例:在这里插入图片描述这个就是把三个微服务的实例注册上了zookeeper上了。在这里插入图片描述每个节点的内容如下:name为provider。id:是每一个节点的uuid的值。

address是本机的名字,也就是代表主机。port:8081。在每一个节点都已经记录好了这些内容的。最重要的是端口号和ip地址。在这里插入图片描述6、客户端也需要引入zookeeper的依赖:

客户端就可以运用zookeeper中的ribbon的负载均衡机制在这里插入图片描述ribbon当中其实有两个组件:httpclient(客户端调用)和loadbalancer(负载均衡器,因为它是从客户端拉取到可用的服务列表)

loadbalancer:这个自动有负载均衡策略的。它 针对SpringCloud所有的服务发现都可以来做的。在这里插入图片描述7、客户端的配置文件的配置如下:在这里插入图片描述8、客户端的主类函数如下在这里插入图片描述9、由于客户端是发现zookeeper上的服务列表的,所以也需要加上启用服务发现的注解,代码如下:在这里插入图片描述10、然后启动消费端,连续访问6次:在这里插入图片描述
下面的结果就是轮巡的方式做了负载的。在这里插入图片描述服务端每个节点都打印两条sql.在这里插入图片描述在这里插入图片描述在这里插入图片描述上面的方式就可以做到了负载均衡。

还有一种方式:

1、加上@LoadBalanced注解在这里插入图片描述在这里插入图片描述这种方式默认的方式也是轮巡的方式。

下面的接口里面是负载均衡的机制:这个接口里面有随机的策略,重试的策略。在这里插入图片描述轮巡策略,权重策略。在这里插入图片描述

总结:在微服务中服务与服务的通信是通过restf风格的方式来进行通信的,上面的方式是ribbon加上restTemplate方式来实现的,ribbon在微服务中做客户端的负载均衡充当了重要的角色。服务端的负载均衡可以通过nginx来做。

欢迎各位小伙伴来咨询,想要工程源码的加群:797853299

### Spring Cloud 微服务架构中的 `cloud-provider-payment8001` 配置与实现 #### 一、基础配置解析 在微服务架构中,`application.yml` 文件用于定义服务的核心属性。对于 `cloud-provider-payment8001` 的配置文件,可以参考类似的结构来设置端口和服务注册中心的信息: ```yaml server: port: 8001 # 定义服务运行的端口号[^1] spring: application: name: cloud-provider-payment8001 # 设置应用名称 cloud: nacos: discovery: server-addr: localhost:8848 # Nacos 注册中心地址 ``` 上述配置明确了服务启动时所需的必要参数,包括服务名和端口号。 --- #### 二、负载均衡规则自定义 为了优化请求分发策略,在某些场景下可能需要自定义 Ribbon 负载均衡器的行为。通过创建一个新的包路径 `demo.yangxu.myrule` 并在其内部编写自定义规则类 `MySelfRule.java`,能够满足特定需求[^2]。 以下是该规则的一个简单示例代码片段: ```java import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.RandomRule; public class MySelfRule extends RandomRule implements IRule { @Override public Server choose(Object key) { List<Server> reachableServers = this.getLoadBalancer().getReachableServers(); int size = reachableServers.size(); if (size == 0) { return null; // 如果无可用服务器,则返回null } Random random = new Random(); return reachableServers.get(random.nextInt(size)); // 自定义随机选取逻辑 } } ``` 此代码实现了基于随机算法的服务选择机制,并可进一步扩展以适应更复杂的业务场景。 --- #### 三、测试工具支持 针对异步调用或集成测试的需求,推荐使用以下几种工具简化开发流程并提升效率[^3]: | 工具名称 | 功能描述 | |----------------|------------------------------------------------------------------------| | **Awaitility** | 提供同步化操作的支持,便于处理延迟响应的任务 | | **GreenMail** | 构建内存级邮件服务器模拟环境,适用于涉及电子邮件功能的应用程序 | | **REST Assured** | 设计专门面向 RESTful API 测试框架,方便验证接口行为 | 这些工具可以帮助开发者快速定位潜在问题所在区域,从而减少调试时间成本。 --- #### 四、虚拟节点管理方案 如果计划引入容器编排技术(如 Kubernetes),则可以通过部署 Virtual Kubelet 来动态增加计算资源供给能力[^4]。这种方式特别适合于应对突发流量高峰时期的工作负载压力调整情况下的弹性伸缩解决方案设计思路探讨方向之一。 --- ### 总结 综上所述,围绕着 `cloud-provider-payment8001` 这个具体项目实例展开讨论了其基本配置方法论以及高级特性定制手段等内容;同时还提及了一些辅助性的第三方库选型建议以便更好地服务于整个系统的稳定性保障工作当中去执行下去落实到位才行哦!
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值