源码-笔记: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服务治理的更多相关文章

  1. Spring Cloud Alibaba 初体验(二) Nacos 服务注册与发现 + 集成 Spring Cloud Gateway

    一.服务注册 添加依赖: <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>s ...

  2. SpringCloud Alibaba微服务实战三 - 服务调用

    导读:通过前面两篇文章我们准备好了微服务的基础环境并让accout-service 和 product-service对外提供了增删改查的能力,本篇我们的内容是让order-service作为消费者远 ...

  3. Dubbo框架应用之(二)--服务治理

    Dubbo服务治理全貌图 当我们现有ITOO平台系统的业务随着用户的逐渐增大,设计的业务越来越广,系统会异常的复杂,在大规模服务之前,我们可以采用的是RMI或Hessian等工具,暴露和引用远程服务, ...

  4. springcloud超简单的入门2--Eureka服务治理

    Eureka服务治理 下面请听第一个话题,母...咳咳,拿错书了. Eureka简介 eureka是什么呢? 简单来说呢,当我的微服务应用多了起来,一个一个写死再程序里是件很不优雅的事情,而且同一服务 ...

  5. SpringCloud Alibaba Nacos 服务治理中心

    目录 一.什么是Nacos? 二.Nacos能干吗? 三.Nacos关键特性 四.Nacos中的基本概念 五.如何安装部署Nacos? 六.Nacos数据持久化 一.什么是Nacos? 英文全称Dyn ...

  6. Spring Cloud Alibaba基础教程:Nacos服务发现与配置管理

    随着微服务概念的流行,越来越多的公司采用`Spring Cloud`全家桶构建微服务系统,实现业务的快速迭代.`Spring Cloud`提供了快速构建分布式微服务常用组件,包括`Spring Clo ...

  7. Spring Cloud Alibaba 实战(十二) - Nacos配置管理

    本章主要内容是:使用Nacos管理配置以及实现配置管理的原因,配置如何管理以及动态刷新和最佳实现总结,最后是Nacos配置刷新原理解读 该技术类似于Spring Cloud Config 1 配置管理 ...

  8. SpringCloud Alibaba开篇:SpringCloud这么火,为何还要学习SpringCloud Alibaba?

    写在前面 大家都知道,SpringCloud Alibaba是在SpringCloud基础上开发并开源的一套微服务架构体系.那么,肯定会有小伙伴要问:在微服务领域,SpringCloud已经很火了,为 ...

  9. SpringCloud Alibaba Nacos 服务注册

    业务服务接入Nacos服务治理中心 启动Nacos访问地址为:http://101.200.201.195:8848/nacos/ 创建bom工程用于管理依赖(下方附加源码地址) 准备工作完成后开始接 ...

  10. SpringCloud Alibaba实战(11:引入服务网关Gateway)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 大家好,我是三分恶. 在前面的章节中,我们已经完成了服务间的调用.统一配置等等,在这 ...

随机推荐

  1. Ubuntu 18.04替换默认软件源

    安装Ubuntu 18.04后,默认源在国外,可以替换为国内的源以提升访问速度 参考https://mirrors.ustc.edu.cn/repogen/ sudo vi /etc/apt/sour ...

  2. 【Android】学习day05|RadioButton

    注意事项:当使用默认选中标签:check时,必须要给标签加id,否则失效. 这个没什么,挺简单的,就记录一下代码[监听事件] package com.example.app02; import and ...

  3. C#中HttpWebQuest发起HTTP请求,如何设置才能达到最大并发和性能

    在C#中使用HttpWebRequest发起HTTP请求时,达到最大并发和性能可以从以下几个方面改进: 1. ServicePointManager设置 ServicePointManager 类是一 ...

  4. Centos离线安装JDK+Tomcat+MySQL8.0+Nginx

    一.安装JDK 注:以下命令环境在Xshell中进行. 1.查询出系统自带的OpenJDK及版本 rpm -qa | grep jdk 2.如果显示已安装openjdk则对其进行卸载. #卸载 rpm ...

  5. 三分钟使用github的技巧

    一.GitHub搜索技巧--找开发者 搜索条件 备注 location: location:china,匹配用户填写的地址在china language: language:javascript,匹配 ...

  6. Fast ORM 读写分离功能使用方式

    Fast Framework 作者 Mr-zhong 代码改变世界.... 一.前言 Fast Framework 基于NET6.0 封装的轻量级 ORM 框架 支持多种数据库 SqlServer O ...

  7. 【matlab混沌理论】1.5.洛伦兹模型的分析

    洛伦兹方程用于生成y变量的图.这是对三种y初始条件敏感依赖的一个例子. 1.洛伦兹吸引子的y敏感依赖的着色图 input: % 洛伦兹方程用于生成y变量的图.x和z的初始条件保持不变,但y的初始条件在 ...

  8. SpringBoot测试用例的一些小技巧~

    场景一:不想因为测试而对数据库产生脏数据 @Test public void testInsert() { User user = new User(); user.setUsername(" ...

  9. Java8新特性Stream流

    1.是什么? Stream(流)是一个来自数据源的元素队列并支持聚合操作 2.能干嘛? Stream流的元素是特定类型的对象,形成一个队列. Java中的Stream并不会存储元素,而是按需计算. 数 ...

  10. LIS(比动态规划更快的解法N*logN)

    以[1,3,8,17,5,14,10]为例,首先我们需要开设一个栈S保存,栈中的元素S[i]代表了以S[i]结尾的长度为i+1的最长上升子序列的最小取值(0<=i). 然后执行下列算法步骤: ( ...