微服务的基础使用

news/2024/10/21 23:04:31/

微服务

Maven的依赖冲突解决方案:

  • 路径最短原则

  • 配置优先原则

  • 破坏规则则使用排除

  • SpringBoot场景启动器starter的开发流程

    c3p0-spring-boot-starter自定义场景启动器

    test-c3p0调用自定义场景启动器

  • SpringBoot自动装配

  • SpringBoot应用启动原理

  • nacos服务治理

    • 安装
    • 启动bin/startup -m standalone
    • webUI地址为localhost:8848/nacos,其中用户nacos/nacos
    • 关闭bin/shutdown

微服务

将应用划分为若干个体量更小的服务,每个服务可以独立开发、独立部署、独立运行,服务之间可以通过轻量级通信机制进行相互调用

用户管理系统

  • 用户微服务

    create database test1;
    use test1;create table tbl_users(id bigint primary key auto_increment,name varchar(32) not null,role_id bigint
    )
    
  • 角色微服务

    create database test2;
    use test2;create table tbl_role(id bigint primary key auto_increment,name varchar(32) not null
    )
    

针对不同的服务当作一个独立的应用进行开发

@RestController // 轻量级通信机制  http+json
public class UserController{@Autowired private RestTemplate restTemplate;      //可以当作浏览器对待@Autowired private IUserServ userService;@RequestMapping("/get")public String getUser(){//当前应用内部业务User user=userService.load(1);  //从当前应用中加载对应的1号用户信息Role role=restTemplate.getForObject("role服务的地址",Role.class);....}
}

role服务的地址的问题:

  • 方法1:使用绝对路径,例如http://localhost:7081/roles/1。问题是role服务的地址可能会出现调整,或者role服务由于频繁访问需要多节点部署
  • 针对方法1的缺陷引入中间件nacos作为注册中心。
    • 当所有的服务提供者,例如role服务,启动时都会自动向nacos注册自己的信息,例如服务的名称,自己的地址和自己对外提供服务的端口号等
    • 当服务消费者需要调用服务时,可以向nacos查询对应服务名称的提供者地址列表,例如通过role-service服务名获取到所有的role服务的地址列表

Nacos应用步骤

服务提供者

1、添加依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2、添加配置

spring.application.name=role-service   定义的服务名称,服务消费者是通过服务名称查找地址
spring.cloud.nacos.discovery.server-addr=localhost:8848  Nacos的地址

3、在配置类上添加注解以启动Nacos客户端

@EnableDiscoveryClient  也可以直接定义在主类
@SpringBootConfiguration
public class NacosConfig {
}

Nacos

1、安装

2、 启动nacos命令startup -m standalone

3、启动服务提供者

4、在nacos的webUI可以查看localhost:8848/nacos

服务消费者

1、依赖

<dependency>    <groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2、配置

spring.application.name=user-service   定义的服务名称,服务消费者是通过服务名称查找地址
spring.cloud.nacos.discovery.server-addr=localhost:8848  Nacos的地址

3、通过注解启动nacos client

@EnableDiscoveryClient

4、可以通过nacos client查询注册在nacos中的所有对应的服务提供者

@RestController
public class TestController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping("/test")public String test(String name){
//        String url="http://localhost:8070/hello?name=zhangsan"//从nacos根据服务名称获取对应的服务提供方的地址端口号等信息List<ServiceInstance> serviceInstances = discoveryClient.getInstances("hello-service");//从nacos种获取服务列表后需要根据某种策略获取某一个具体的服务实例---负载均衡Random r=new Random();ServiceInstance instance = serviceInstances.get(r.nextInt(serviceInstances.size()));System.out.println("远程服务的主机地址:"+instance.getHost());System.out.println("远程服务的端口号:"+instance.getPort());//拼接访问的URL地址String url=instance.getUri()+"/say?name="+name;System.out.println("远程服务地址:"+url);String res = restTemplate.getForObject(url, String.class);return "Consumer:["+res+"]";}
}

http://www.ppmy.cn/news/1000627.html

相关文章

Java类与对象详解(2)

this引用 为什么要有this引用 先来看一个日期类的例子&#xff1a; ​ public class Date {public int year;public int month;public int day;//设置日期方法public void setDay(int y, int m, int d){//这里隐藏了一个Date this参数year y;month m;day d;}public void …

将程序打包成单一一个可执行文件

最近做了一个界面交互渲染的小项目&#xff0c;项目主要的功能是通过TCP接收数据然后在界面中渲染出对应的状态。由于用户的最大需求是炫酷&#xff0c;于是为了方便实现特殊的交互逻辑&#xff0c;我选择用freeglut自行实现了界面的交互和渲染&#xff0c;又用OpenCV做了部分图…

JDK8:Stream流0基础使用与深入理解,Stream流源码分析

文章目录 一、概述二、集合操作演进对比1、JDK7传统方式2、JDK8 使用Stream3、小结 三、流实现思想1、外部迭代2、内部迭代 四、函数式编程五、流操作详解1、流的分类&#xff08;1&#xff09;中间操作&#xff08;2&#xff09;终止操作 2、构建流&#xff08;1&#xff09;基…

「网络编程」传输层协议_ TCP协议学习_及原理深入理解(二 - 完结)[万字详解]

「前言」文章内容大致是传输层协议&#xff0c;TCP协议讲解的第二篇&#xff0c;续上篇TCP。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 二、TCP协议2.9 TCP连接管理机制2.9.1 三次握手2.9.2 四次挥手2.9.3 演示查看TIME_WAIT和CLOSE_WAIT状态2.9.…

封装动态SQL的插件

最近根据公司的业务需要封装了一个简单的动态SQL的插件&#xff0c;要求是允许用户在页面添加SQL的where条件&#xff0c;然后开发者只需要给某个接口写查询对应的表&#xff0c;参数全部由插件进行拼接完成。下面是最终实现&#xff1a; 开发人员只需要在接口写上下面的查询SQ…

无代码开发:打破传统开发模式,引领数字化转型新方向

随着数字化转型的加速&#xff0c;企业对于高效、便捷的软件开发需求愈发旺盛。无代码开发作为一种新兴的软件开发模式&#xff0c;以其可视化、模块化的开发方式&#xff0c;为数字化转型提供了新的方向。本文将从无代码开发的优势、应用场景、如何实现等方面进行详细解读&…

Centos7搭建Apache Storm 集群运行环境

文章目录 1. 安装 Java2. 下载并解压 Storm3. 配置环境变量4. 配置 ZooKeeper5. 配置 Stormstorm.yaml自定义 storm.yamlstorm-env.shlogback/cluster.xml 6. 启动 Storm 集群7. 验证 1. 安装 Java Storm 运行在 Java 平台上&#xff0c;因此需要先安装 Java。你可以使用以下命…

[RK3568 Android11] 开发之默认授予系统预置的APP权限

[RK3568 Android11] 开发之默认授予系统预置的APP权限 [RK3568 Android11] 开发之默认授予系统预置的APP权限_rk3568 授予所有文件的管理权限_~未来可期~的博客-CSDN博客