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模块组件,有些组件是必不可少的:注册中心、服务提供者,服务消费者、服务网关,服务路由
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 )
service-A:
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);
}
}
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 = “/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)]