技术标签: 2024年程序员学习 微服务 java spring cloud
springboot项目开发技术+springcloud基础概念
项目截图
项目模块说明:
micro-service
=============
spring-cloud 微服务组件demo
工程名 | 描述 | 端口 |
eureka-server | 服务发现与注册中心 | 7071 |
ribbon | 负载均衡器 | 7072 |
zuul | 动态路由器 | 7073 |
service-A | A服务,实现两个数相加,用来测试服务间调用与路由 | 2222 |
service-B2 | B2服务,实现两个数相减,用来测试负载均衡和微服务的调用与路由 | 7078 |
service-B3 | B3服务,和B2服务一样的,实现两个数相减,用来测试负载均衡和微服务之间的调用与路由 |
在搭建之前简单介绍下SpringCloud的概念:
SpringCloud按照项目部署可以分为以下几个主要部分
注册中心(服务目录服务)、配置中心(集中式配置管理中心)、服务端(服务提供者)、客户端(服务消费者)、服务网关,服务路由, 负载均衡
注册中心:
主要要功能就是服务注册与服务发现。每个应用启动时都会将自己的应用名称以及提供的接口注册到注册中心以提供给其他应用调用,同时订阅发现其他应用提供的服务用于自己消费。注册中心维护着所有的服务注册信息
技术选型:Eureka
配置中心:
配置中心统一管理应用配置文件。配置中心的加入可以避免当配置变更时应用重新打包发布等操作。并且还可以在运行期间动态修改配置。
技术选型:
服务端(服务提供者):
服务提供者在整个分布式架构中起着非常重要的角色。其他应用依赖于该角色提供的服务才能够正常的运行,同时服务提供者也可以消费其他服务提供者提供的服务。既是服务提供者也是服务消费者
技术选型:普通的springboot项目
客户端(服务消费者)
服务消费者主要就是通过消费其他服务提供者提供的服务来完成自己的业务逻辑,从而对外提供各种各样的系统功能。
服务网关:
访问各类服务的请求时的权限认证等安全处理
技术选型:Zuul
服务路由;
路由”是指根据请求URL,将请求分配到对应的处理程序。
如SpringMVC的DispatchServlet,统一接收所有需要SpringMVC处理的请求,再根据指定的匹配规则,将请求映射到最终的Controller中的某个方法
这里是对服务的处理路由
负载均衡:
如何将服务消费者均匀分摊到多个服务提供者实例上,就要使用到负载均衡器
技术选型: Ribbon 是负载均衡器 ,它提供了很多负载均衡算法,例如轮询、随即等,在配置服务提供者地址后,可以将服务消费者请求均匀的分发
根据SpringCloud模块组件,有些组件是必不可少的:注册中心、服务提供者,服务消费者、服务网关,服务路由
注册中心:eureka-sever
服务提供者:service-A
服务消费者:service-B2
服务网关-服务路由:zuul(Zuul的主要功能是路由和过滤器。)
负载均衡:ribbon
注册中心:eureka-sever
=================
springboot选择最低既可以,稳定!
按下图编写基本类:
首先在EurekaServer中加入注解@EnableEurekaServer 启用这个功能
然后修改application配置文件
由于每个eureka serve项目均为client,而当下要建立的是一个纯eureka serve服务,
所以增加fetch-registry: false register-with-eureka: false两项配置来告诉系统该服务并非是client无需将其注册到服务中心。
8761为注册中心的默认端口,这里修改为7071
做完上面配置,可以登录localhost:7071【服务注册中心】的管理界面查看
此时注册中心没有显示任何注册的服务,下面我们将创建服务并服务注册进去》
首先,建立一个拥有WEB、Eureka Discovery依赖的两个基础功能的项目
创建过程同上,区别只是依赖不同:
创建好之后入下图:
然后在两个服务项目的启动类都 A_Application B2_Application 增加@EnableEurekaClient注解 开启功能
继续修改配置文件 修改内容为
注意:service-A service-B2两个微服务搭建的端口不同
建立Controller 编写测试业务逻辑(service-A service-B2 )
package com.dk.web;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ComputeController {
private final Logger logger = Logger.getLogger(getClass());
@Autowired
private DiscoveryClient client;
@RequestMapping(value = “/add” ,method = RequestMethod.GET)
public String add(@RequestParam Integer a, @RequestParam Integer b) {
ServiceInstance instance = client.getLocalServiceInstance();
Integer r = a + b;
logger.info(“/add, host:” + instance.getHost() + “, service_id:” + instance.getServiceId() + “, result:” + r);
return “From Service-A, Result is " + r+”\nPort:"+instance.getPort();
}
//call service-B
@RequestMapping(value=“testServiceB”,method=RequestMethod.GET)
public String testServiceB(@RequestParam Integer a,@RequestParam Integer b){
RestTemplate restTemplate=new RestTemplate();
return restTemplate.getForObject(“http://localhost:7078/add?a=”+a+“&b=”+b, String.class);
}
}
package com.dk.web;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ComputeController {
private final Logger logger = Logger.getLogger(getClass());
@Autowired
private DiscoveryClient client;
@RequestMapping(value = “/sub” ,method = RequestMethod.GET)
public String sub(@RequestParam Integer a, @RequestParam Integer b) {
ServiceInstance instance = client.getLocalServiceInstance();
Integer r = a - b;
logger.info(“/sub, host:” + instance.getHost() + “, service_id:” + instance.getServiceId() + “, result:” + r);
return “From Service-B, Result is " + r+” \nPort:"+instance.getPort();
}
//call service-A
@RequestMapping(value=“testServiceA”,method=RequestMethod.GET)
public String testServiceB(@RequestParam Integer a,@RequestParam Integer b){
RestTemplate restTemplate=new RestTemplate();
return restTemplate.getForObject(“http://localhost:2222/add?a=”+a+“&b=”+b, String.class);
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
Java架构进阶面试及知识点文档笔记
这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理
Java分布式高级面试问题解析文档
其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!
互联网Java程序员面试必备问题解析及文档学习笔记
Java架构进阶视频解析合集
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理**
[外链图片转存中…(img-gyzpNaZN-1712673539678)]
Java分布式高级面试问题解析文档
其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!
[外链图片转存中…(img-tdSF7q3K-1712673539678)]
互联网Java程序员面试必备问题解析及文档学习笔记
[外链图片转存中…(img-QwebZrCX-1712673539679)]
Java架构进阶视频解析合集
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-uYfXFLlJ-1712673539679)]
文章浏览阅读222次。课程回顾:面向对象数组异常常用类集合IO流今日内容:进程:应用程序运行时,产生的独立的应用程序,拥有独立的代码和存储空间多进程:操作系统可以并发的执行多个进程线程:进程内部的一条执行路径多线程:java语言支持程序内部进行多线程开发进程内部可以有多个线程线程的作用:可以分担压力,提高性能主要用来完成耗时
文章浏览阅读71次。例如:雷1J10%冰技能+37火每等级,这样就可以30%出现属性,如果没有出,可以破坏某一个洞,继续镶嵌同属性的宝石,直到定现为止,由于1J雷和37技能冰的比较贵,所以可以破坏火荧石,不断镶嵌到出现属性为止。荧光宝石可从以前的物品中获得。从上到下的镶嵌顺寻按照雷、冰、火镶嵌,就有30%的概率出现技能攻击力加11的幸运荧光属性。从上到下的镶嵌顺寻按照土、风、水镶嵌,就有30%的概率出现最大生命值+29的幸运荧光属性。从上到下的镶嵌顺寻按照火、冰、雷镶嵌,就有30%的概率出现攻击力加11的幸运荧光属性。
文章浏览阅读8.8k次,点赞21次,收藏51次。这篇文章的意义在于哪里呢?1)向大家展示如何形式化定义一个搜索问题,又如何去求解;2)通过讲述各种盲目搜索算法,帮大家梳理无信息搜索的脉络。_无信息搜索又称为
文章浏览阅读847次,点赞18次,收藏20次。图像重建是数字信号处理领域的一个重要问题,它涉及到从损坏或不完整的图像数据中恢复出高质量的图像。在图像重建的研究中,小波变换结合各种重建算法已经成为一个热门的研究方向。本文将介绍基于小波变换结合BP、OMP、StOMP算法实现图像重建,并对重建效果进行评估,包括均方误差(MSE)和峰值信噪比(PSNR)。小波变换是一种多尺度分析方法,它可以将信号分解成不同尺度的频率成分,从而更好地捕捉信号的局部特征。在图像重建中,小波变换可以将图像分解成不同尺度的小波系数,然后利用这些小波系数进行重建。
文章浏览阅读685次。用变量a给出下面的定义:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数并返回一个整型数*int a[10];这是一个指针数组。数组a里存放的是10个int型指针*int (a)[10];这是一个数组指针。a是指针,指向一个数组。数组a有10个int型元素。*int (a)(int);这个表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个函数,这个函数有一个类..._int*做参数如何判断是整型还是数组
文章浏览阅读1k次。1.删除0字节文件find -type f -size 0 -exec rm -rf {} ;2.查看进程按内存从大到小排列ps -e -o “%C : %p : %z : %a”|sort -k5 -nr3.按cpu利用率从大到小排列ps -e -o “%C : %p : %z : %a”|sort -nr4.打印说cache里的URL_linux cp命令加正则表达式
文章浏览阅读3.7k次,点赞3次,收藏10次。本文基于webrtc最新源码进行抽取编译做简单讲解。最终目的是Android 单独抽取 WebRtc-VAD 模块,封装好JNI层,并且ndk-build出so库。希望对大家有所帮助,有需要看JNI层实现和完整demo的,请加我V:15092216090先来看一下vad模块的头文件,webrtc_vad.h,该文件路径为common_audio\vad\include\webrtc_v..._android webrtc vad
文章浏览阅读262次。John Smith曾经是我的好基友,没有之一,今天我们拿他做个试验:初始代码,我们做一个打印员工John Smith信息的类,实例emp_1会用类属性输出:class Employee: def __init__(self, first, last): self.first = first self.last = last self.email = first + "." + last + '@email.com' def fullnam_@property (decorators)
文章浏览阅读2.4k次。sql查询中,一个字段多个结果拼接的两种方式_oracle 一个字段多条记录的拼接
文章浏览阅读934次。clear报错_[vue/comment-directive] clear
文章浏览阅读2.7k次。关键词识别和语音听写还是有差别的,语音听写是直接将所说的话转化成语音,至于识别的准确率看所说的话是否是常用的,如果遇到不常见的词比如背身腿降这个指令,识别出来的就是乱七八糟的。而关键词识别也就是针对这种关键词识别有很好的效果,在于你自己构建一个.bnf文件,然后写上关键词#BNF+IAT 1.0 UTF-8;!grammar call;!slot <contact>;!slo..._科大讯飞构建语法树
文章浏览阅读701次。提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录DeepCache:Principled Cache for Mobile Deep Vision (MobiCom2018)一、摘要二、缓存的思想和挑战1. 缓存思想的引入1) CNN是视频处理的常用算法,但在资源有限的设备端受限2) 如何解决设备端受限这一问题——缓存2. 挑战1) 缓存中的可重用结果查找2) CNN中间特征图的细粒度重用3) 平衡可缓存性、模型准确性和高速缓存开销4) 对抗缓存侵蚀(cache erosion._deepcache