SpringCloud Alibaba技术栈(二)Nacos服务治理
源码-笔记:Code for Github
第二章 Nacos服务治理
1. 模块设计与实现
①首先创建maven项目,此项目作为父工程。把src文件夹删掉,修改pom文件,添加依赖版本控制,控制子模块依赖的版本。
②实体类模块创建(在微服务中,实体类单独作为一个模块,供其他微服务一起使用,不在每个单独的微服务中设置domain):添加子模块,右击项目,new module,创建maven项目,创建domain包,在包下创建数据库中表对应的各种实体,以及封装controller return数据的实体 CommonResult
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T> {
private int code;
private String message;
private T data;
public CommonResult(Integer code,String message){
this(code,message,null);
}
}
在 controller 中使用实例:
@RequestMapping(value = "/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable Integer id){
try {
// Payment payment = paymentService.getPaymentById(id);
Payment payment = paymentServiceImpl1.getPaymentById(id);
if (payment != null) {
return new CommonResult<>(200, "查询成功", payment);
} else {
return new CommonResult<>(444, "没有对应记录,查询ID:" + id, null);
}
}
catch (Exception e){
return new CommonResult<>(444, "异常,没有对应记录,查询ID:" + id, null);
}
}
③添加子模块,右击项目,new module,创建maven项目,剩下操作与创建springboot项目一样:
a.引入依赖,配置application.yml
b.创建启动类:@SpringBootApplication,main方法中SpringApplication.run()
c.开发dao,service,controller
2. 服务注册到Nacos
①首先安装部署nacos,安装地址:Nacos安装地址
双击运行bin目录下的startup.cmd即可。
这里的正确做法是:
启动服务器:bin 目录进入CMD -> 执行
startup.cmd -m standalone启动命令(standalone代表着单机模式运行,非集群模式)
关闭服务器:
shutdown.cmd或者 双击shutdown.cmd运行文件
nacos的控制台界面地址:http://localhost:8848/nacos,默认用户名密码都是nacos
②注册微服务
在微服务模块的pom文件下增加依赖:
<!--nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
在启动类上添加注解:@EnableDiscoveryClient
在配置文件下增加nacos地址:
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
先运行nacos再运行微服务,可以在nacos的服务列表上看到该微服务已经注册进来。
3. 服务调用(使用restTemplate)
使用restTemplate传递http请求,实现微服务间的调用。
a.创建配置包,在包里创建配置类
@Configuration
public class ApplicationContexConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
b.在controller中使用@Autowired注入,并调用其方法getForObject访问相关微服务的接口。
c.DiscoveryClient的getInstances方法可以找到在nacos上注册的微服务接口的实例,通过instance的getHost方法getPort方法,可以找到接口访问地址。搭配b实现服务调用。
实例代码:
List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
int index = new Random().nextInt(instances.size());
ServiceInstance serviceInstance = instances.get(index);
Product p = restTemplate.getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/product/"+pid,Product.class);
4. 服务调用的负载均衡
多个相同的服务共同承担消费者的调用。
服务端负载均衡:请求从服务请求者发出,到达服务端时,由服务端决定调用哪个。
客户端负载均衡:服务请求者在发出请求前就已经决定好调用哪个。
在微服务中的controller上写代码,决定如何调用其他微服务,属于客户端负载均衡。
4.1 自定义实现负载均衡
int index = new Random().nextInt(instances.size());
4.2 基于Ribbon实现负载均衡
①在RestTemplate 的生成方法上添加@LoadBalanced注解
②restTemplate调用时直接用服务名替换接口地址。如下:
Product p = restTemplate.getForObject("http://service-product/product/"+pid,Product.class);
可以在配置文件中添加相关配置,来修改Ribbon的策略。
service-product: # 调用的提供者的名称
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
5. 使用feign实现服务调用
①引入feign依赖
<!--fegin组件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
②在主类上添加Fegin的注解:@EnableFeignClients//开启Fegin
③创建一个service, 并使用Fegin实现微服务调用,实例代码:
@FeignClient("service-product")//声明调用的提供者的name
public interface ProductService {
//指定调用提供者的哪个方法
//@FeignClient+@GetMapping 就是一个完整的请求路径 http://serviceproduct/product/{pid}
@GetMapping(value = "/product/{pid}")
Product findByPid(@PathVariable("pid") Integer pid);
}
调用:先注入,然后productService.findByPid(pid);
SpringCloud Alibaba技术栈(二)Nacos服务治理的更多相关文章
- Spring Cloud Alibaba 初体验(二) Nacos 服务注册与发现 + 集成 Spring Cloud Gateway
一.服务注册 添加依赖: <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>s ...
- SpringCloud Alibaba微服务实战三 - 服务调用
导读:通过前面两篇文章我们准备好了微服务的基础环境并让accout-service 和 product-service对外提供了增删改查的能力,本篇我们的内容是让order-service作为消费者远 ...
- Dubbo框架应用之(二)--服务治理
Dubbo服务治理全貌图 当我们现有ITOO平台系统的业务随着用户的逐渐增大,设计的业务越来越广,系统会异常的复杂,在大规模服务之前,我们可以采用的是RMI或Hessian等工具,暴露和引用远程服务, ...
- springcloud超简单的入门2--Eureka服务治理
Eureka服务治理 下面请听第一个话题,母...咳咳,拿错书了. Eureka简介 eureka是什么呢? 简单来说呢,当我的微服务应用多了起来,一个一个写死再程序里是件很不优雅的事情,而且同一服务 ...
- SpringCloud Alibaba Nacos 服务治理中心
目录 一.什么是Nacos? 二.Nacos能干吗? 三.Nacos关键特性 四.Nacos中的基本概念 五.如何安装部署Nacos? 六.Nacos数据持久化 一.什么是Nacos? 英文全称Dyn ...
- Spring Cloud Alibaba基础教程:Nacos服务发现与配置管理
随着微服务概念的流行,越来越多的公司采用`Spring Cloud`全家桶构建微服务系统,实现业务的快速迭代.`Spring Cloud`提供了快速构建分布式微服务常用组件,包括`Spring Clo ...
- Spring Cloud Alibaba 实战(十二) - Nacos配置管理
本章主要内容是:使用Nacos管理配置以及实现配置管理的原因,配置如何管理以及动态刷新和最佳实现总结,最后是Nacos配置刷新原理解读 该技术类似于Spring Cloud Config 1 配置管理 ...
- SpringCloud Alibaba开篇:SpringCloud这么火,为何还要学习SpringCloud Alibaba?
写在前面 大家都知道,SpringCloud Alibaba是在SpringCloud基础上开发并开源的一套微服务架构体系.那么,肯定会有小伙伴要问:在微服务领域,SpringCloud已经很火了,为 ...
- SpringCloud Alibaba Nacos 服务注册
业务服务接入Nacos服务治理中心 启动Nacos访问地址为:http://101.200.201.195:8848/nacos/ 创建bom工程用于管理依赖(下方附加源码地址) 准备工作完成后开始接 ...
- SpringCloud Alibaba实战(11:引入服务网关Gateway)
源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 大家好,我是三分恶. 在前面的章节中,我们已经完成了服务间的调用.统一配置等等,在这 ...
随机推荐
- 普冉PY32系列(十二) 基于PY32F002A的6+1通道遥控小车III - 驱动篇
目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...
- 电子元器件工厂的金蝶 ERP 与赛意 WMS 系统数据集成平台进行对接
项目背景 国内某晶振集成电路研发单位,涵盖从产品开发.设计.生产.销售.服务等各个环节.需要全面建成以ERP.WMS.BOM.PLM.DMS.SRM.OA 为核心的企业信息系统,支持研发.生产.营销. ...
- 百度API学习 | day01
大作业:(2023.12.27日完成) 各位同学可根据自身情况进行选择: 选项一:根据实验一.二.三完成如下任务: 任务一:基于Jfinal构建信息管理系统,要求包含用户管理,翻译业务模块管理,图片优 ...
- C++ 通过CryptoPP计算Hash值
Crypto++ (CryptoPP) 是一个用于密码学和加密的 C++ 库.它是一个开源项目,提供了大量的密码学算法和功能,包括对称加密.非对称加密.哈希函数.消息认证码 (MAC).数字签名等.C ...
- Educational Codeforces Round 101 (Rated for Div. 2) E - A Bit Similar
题目传送门 很巧妙的一道题.对于一个 \(n\)位的 \(01\)字符串,一共有 \(2^n\)种不同字符排列,对于任意一个固定排列,在 \(2^n\)种排列中只有一种排列与该固定排列处处不等,而题干 ...
- 快速认识,前端必学编程语言:JavaScript
JavaScript是构建Web应用必学的一门编程语言,也是最受开发者欢迎的热门语言之一.所以,如果您还不知道JavaScript的用处.特点的话,赶紧补充一下这块基础知识. JavaScript 是 ...
- SpringBoot实现Flyway的Callback回调钩子
背景 产品迭代使用CI/CD升级过程中,需要对不同发布环境的不同产品版本进行数据库迭代升级,我们在中间某次产品迭代时加入了Flyway中间件以实现数据库结构的自动化升级. 需求 由于是迭代过程中加入的 ...
- 从0到1,手把手带你开发截图工具ScreenCap------001实现基本的截图功能
ScreenCap---Version:001 说明 从0到1,手把手带你开发windows端的截屏软件ScreenCap 当前版本:ScreenCap---001 支持全屏截图 支持鼠标拖动截图区域 ...
- oracle、达梦数据库、MySQL数据创建表与字段注释
/**1.oracle注释*//*表本身注释*/comment on table 表名 is '注释信息';/*字段注释*/comment on column 表名.字段名 is '注释信息';/*实 ...
- AtomicArray
AtomicInteger ai = new AtomicInteger(1); //1.获取值 System.out.println("ai.get = "+ai.get()); ...