最后
本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们:
目录:
Java面试核心知识点
一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!
Java面试核心知识点
(1)初始化 service-1-server Maven 工程
与服务提供方 Maven工程类似,需添加相关 Maven 依赖:
<?xml version="1.0" encoding="UTF-8"?><project xmlns=“http://maven.apache.org/POM/4.0.0”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>
service‐1
com.demo.nacos
1.0-SNAPSHOT
4.0.0
service‐1‐server
com.demo.nacos
service‐1‐api
1.0-SNAPSHOT
com.demo.nacos
service‐2‐api
1.0-SNAPSHOT
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
com.alibaba.cloud
spring-cloud-starter-dubbo
(2)实现 Dubbo 服务
package com.demo.microservice.service1.service;
import com.demo.microservice.service1.api.ConsumerService;
import com.demo.microservice.service2.api.ProviderService;
/**
-
Description:
-
DATE: 2022/1/27 11:13
*/
@org.apache.dubbo.config.annotation.Service
public class ConsumerServiceImpl implements ConsumerService {
@org.apache.dubbo.config.annotation.Reference
ProviderService providerService;
@Override
public String service() {
String service = providerService.service();
return “Consumer invoke |”+service;
}
}
注意:使用@org.apache.dubbo.config.annotation.Service标记dubbo服务
(3)配置 Dubbo 服务
Service2 作为Dubbo服务消费方配置与服务提供方类似,注意,service1不仅是消费方,同时还是服务提供方:
server:
port: ${port:56030} #启动端口 命令行注入
spring:
application:
name: service1
main:
allow‐bean‐definition‐overriding: true # Spring Boot 2.1 需要设定
cloud:
nacos:
discovery:
server‐addr: 127.0.0.1:8848
namespace: 20dd9cd5-8ce6-4f73-8380-dfa3074ce5a8
cluster‐name: DEFAULT
config:
server‐addr: 127.0.0.1:8848 # 配置中心地址
file‐extension: yaml
namespace: 20dd9cd5-8ce6-4f73-8380-dfa3074ce5a8 # 开发环境
group: NACOS_MICROSERVICE_GROUP # xx业务
dubbo:
scan:
dubbo 服务扫描基准包
base‐packages: com.demo.microservice
protocol:
dubbo 协议
name: dubbo
dubbo 协议端口
port: ${dubbo_port:20881}
registry:
address: nacos://127.0.0.1:8848
application:
qos‐enable: false #dubbo运维服务是否开启
consumer:
check: false #启动时就否检查依赖的服务
以上 YAML 内容,dubbo开头的为dubbo服务 的配置:
-
dubbo.scan.base-packages : 指定 Dubbo 服务实现类的扫描基准包,将@org.apache.dubbo.config.annotation.Service注解标注的service暴露为dubbo服务。
-
dubbo.protocol : Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称, port 为dubbo协议端口可以指定多协议,如:dubbo.protocol.rmi.port=1099
-
dubbo.registry : Dubbo 服务注册中心配置,其中子属性 address 的值 “nacos://127.0.0.1:8848”,说明dubbo服务注册到nacos
-
相当于原生dubbo的xml配置中的 <dubbo:registry address=“10.20.153.10:9090” />
上半部分为SpringCloud的相关配置:
-
spring.application.name : Spring 应用名称,用于 Spring Cloud 服务注册和发现。该值在 Dubbo Spring Cloud 加持下被视作 dubbo.application.name ,因此,无需再显示地配置dubbo.application.name
-
spring.cloud.nacos.discovery : Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
-
spring.cloud.nacos.config : Nacos 配置中心配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口。
(4)启动服务消费方应用
package com.demo.microservice.service1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
-
Description:
-
DATE: 2022/1/27 11:19
*/
@SpringBootApplication
@EnableDiscoveryClient
public class Service1Bootstrap {
public static void main(String[] args) {
SpringApplication.run(Service1Bootstrap.class, args);
}
}
当 Service1Bootstrap 启动后,应用 service1 将出现在 Nacos 控制台界面。
启动成功,观察nacos服务列表
=========================================================================================
现在service1已暴露dubbo服务并注册到nacos中,下边实现application1调用service1
下边在application1中引用service1
在pom.xml中引入service-1-api的依赖
com.demo.nacos
service‐1‐api
1.0-SNAPSHOT
引入 spring-cloud-starter-dubbo依赖,它会根据接口生成代理对象
com.alibaba.cloud
spring-cloud-starter-dubbo
package com.demo.microservice.application1.controller;
import com.demo.microservice.service1.api.ConsumerService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
-
Description:
-
DATE: 2022/1/27 10:47
*/
@RestController
public class Application1Controller {
private static final Logger log = LoggerFactory.getLogger(Application1Controller.class);
@org.apache.dubbo.config.annotation.Reference
private ConsumerService consumerService;
@GetMapping(“/service”)
public String service(){
log.info(“进入servcie方法。。。”);
String service = consumerService.service();
return “test|”+service ;
}
}
Note:注意:这里的 @Reference 注解是 org.apache.dubbo.config.annotation.Reference
测试:
请求:http://localhost:56020/application1/service
consumerService正常生成代理对象,service1被调用。
=============================================================================
如上面设计所示,Service2需要暴露dubbo接口以供service1消费,若想在Spring cloud Alibaba中集成并使用
dubbo。
定义service2父工程,pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?><project xmlns=“http://maven.apache.org/POM/4.0.0”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>
nacos‐micro‐service
com.demo.nacos
1.0-SNAPSHOT
4.0.0
service‐2
pom
service‐2‐api
service‐2‐server
定义service-2-api工程,pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?><project xmlns=“http://maven.apache.org/POM/4.0.0”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>
service‐2
com.demo.nacos
1.0-SNAPSHOT
4.0.0
service‐2‐api
并定义服务接口,Dubbo 服务接口是服务提供方与消费方的远程通讯契约,通常由普通的 Java 接口(interface)来声明,如 ProviderService 接口:
package com.demo.microservice.service2.api;
/**
-
Description:
-
DATE: 2022/1/27 11:40
*/
public interface ProviderService {
String service();
}
(1)初始化 service-2-server Maven 工程
首先,创建 artifactId 名为 service-2-server 的 Maven 工程,并在其 pom.xml 文件中增添 Dubbo Spring Cloud 必要的依赖:
<?xml version="1.0" encoding="UTF-8"?><project xmlns=“http://maven.apache.org/POM/4.0.0”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>
service‐2
com.demo.nacos
1.0-SNAPSHOT
4.0.0
service‐2‐server
com.demo.nacos
service‐2‐api
1.0-SNAPSHOT
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
com.alibaba.cloud
spring-cloud-starter-dubbo
以上依赖 artifact 说明如下:
-
service-2-api : 提供 ProviderService 接口的 artifact
-
spring-boot-starter-web : Spring Boot starter artifact ,间接引入 spring-boot artifact
-
spring-cloud-starter-dubbo : Dubbo Spring Cloud Starter artifact ,间接引入 dubbo-spring-bootstarter 等 artifact
-
spring-cloud-starter-alibaba-nacos-discovery : Nacos Spring Cloud 服务注册与发现 artifact
(2)实现 Dubbo 服务
ProviderService 作为暴露的 Dubbo 服务接口,服务提供方 service-2-server 需要将其实现:
package com.demo.microservice.service2.service;
import com.demo.microservice.service2.api.ProviderService;
/**
-
Description:
-
DATE: 2022/1/27 11:47
*/
@org.apache.dubbo.config.annotation.Service
public class ProviderServiceImpl implements ProviderService {
@Override
public String service() {
return “Provider invoke”;
}
}
其中, @org.apache.dubbo.config.annotation.Service 是 Dubbo 服务注解,仅声明该 Java 服务(本地)实现为 Dubbo 服务。 因此,下一步需要将其配置 Dubbo 服务(远程)。
(3)配置 Dubbo 服务
在暴露 Dubbo 服务方面,推荐开发人员外部化配置的方式,即指定 Java 服务实现类的扫描基准包。
同时,Dubbo 远程服务需要暴露网络端口,并设定通讯协议,完整的 YAML 配置如下所示:
server:
port: ${port:56040} #启动端口 命令行注入
spring:
application:
name: service2
main:
allow‐bean‐definition‐overriding: true # Spring Boot 2.1 需要设定
cloud:
nacos:
discovery:
server‐addr: 127.0.0.1:8848
namespace: 20dd9cd5-8ce6-4f73-8380-dfa3074ce5a8
cluster‐name: DEFAULT
config:
server‐addr: 127.0.0.1:8848 # 配置中心地址
file‐extension: yaml
namespace: 20dd9cd5-8ce6-4f73-8380-dfa3074ce5a8 # 开发环境
group: NACOS_MICROSERVICE_GROUP # xx业务
dubbo:
scan:
dubbo 服务扫描基准包
base‐packages: com.demo.microservice
protocol:
dubbo 协议
name: dubbo
dubbo 协议端口
port: ${dubbo_port:20891}
registry:
address: nacos://127.0.0.1:8848
application:
qos‐enable: false #dubbo运维服务是否开启
consumer:
check: false #启动时就否检查依赖的服务
(4)启动服务提供方应用
Dubbo Spring Cloud 引导类与普通 Spring Cloud 应用并无差别,如下所示:
package com.demo.microservice.service2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
-
Description:
-
DATE: 2022/1/27 11:49
*/
@SpringBootApplication
@EnableDiscoveryClient
public class Service2Bootstrap {
public static void main(String[] args) {
SpringApplication.run(Service2Bootstrap.class, args);
}
}
在引导 Service2Bootstrap 之前,请提前启动 Nacos 服务器。 当 Service2Bootstrap 启动后,应用 service2将出现在 Nacos 控制台界面。
=====================================================================================
在service-1-server中pom文件中添加service-2-api的依赖:
com.demo.nacos
service‐2‐api
1.0-SNAPSHOT
package com.demo.microservice.service1.service;
import com.demo.microservice.service1.api.ConsumerService;
import com.demo.microservice.service2.api.ProviderService;
/**
-
Description:
-
DATE: 2022/1/27 11:13
*/
@org.apache.dubbo.config.annotation.Service
public class ConsumerServiceImpl implements ConsumerService {
@org.apache.dubbo.config.annotation.Reference
ProviderService providerService;
@Override
public String service() {
String service = providerService.service();
return “Consumer invoke |”+service;
}
}
测试:
请求:http://localhost:56020/application1/service
application1调用service1,service1调用service2
==============================================================================
什么是网关?
原来的单体架构,所有的服务都是本地的,UI可以直接调用,现在按功能拆分成独立的服务,跑在独立的一般都在独立的虚拟机上的 Java进程了。客户端UI如何访问?他的后台有N个服务,前台就需要记住管理N个服务,一个服务下线/更新/升级,前台就要重新部署,这明显不服务我们拆分的理念,特别当前台是移动应用的时候,通常业务变化的节奏更快。另外,N个小服务的调用也是一个不小的网络开销。
有了网关作为服务统一入口,就可以避免上述问题,不仅如此,服务网关是在微服务前边设置一道屏障,请求先到服务网关,网关会对请求进行过虑、校验、路由等处理。有了服务网关可以提高微服务的安全性,网关校验请求的合法性,请求不合法将被拦截,拒绝访问。
-
提供统一服务入口,让微服务对前台透明
-
聚合后台的服务,节省流量,提升性能
-
提供安全,过滤,流控等API管理功能
1、什么是Zuul?
Spring Cloud Zuul是整合Netflix公司的Zuul开源项目实现的微服务网关,它实现了请求路由、负载均衡、校验过虑等 功能。
官方:https://github.com/Netflix/zuul
2、Zuul与Nginx怎么配合使用?
Zuul与Nginx在实际项目中需要配合使用,如下图,Nginx的作用是反向代理、负载均衡,Zuul的作用是保障微服
务的安全访问,拦截微服务请求,校验合法性及负载均衡。
初始化 api-gateway Maven 工程
<?xml version="1.0" encoding="UTF-8"?><project xmlns=“http://maven.apache.org/POM/4.0.0”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>
nacos‐micro‐service
com.demo.nacos
1.0-SNAPSHOT
4.0.0
api‐gateway
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-zuul
org.springframework.cloud
spring-cloud-starter-openfeign
server:
port: 56010 #启动端口 命令行注入
spring:
application:
name: api-gateway
main:
allow‐bean‐definition‐overriding: true # Spring Boot 2.1 需要设定
cloud:
nacos:
discovery:
server‐addr: 127.0.0.1:8848
namespace: 20dd9cd5-8ce6-4f73-8380-dfa3074ce5a8
cluster‐name: DEFAULT
config:
server‐addr: 127.0.0.1:8848 # 配置中心地址
file‐extension: yaml
namespace: 20dd9cd5-8ce6-4f73-8380-dfa3074ce5a8 # 开发环境
group: NACOS_MICROSERVICE_GROUP # xx业务组
总结
我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。
Mybatis源码解析
rg.springframework.cloud
spring-cloud-starter-openfeign
server:
port: 56010 #启动端口 命令行注入
spring:
application:
name: api-gateway
main:
allow‐bean‐definition‐overriding: true # Spring Boot 2.1 需要设定
cloud:
nacos:
discovery:
server‐addr: 127.0.0.1:8848
namespace: 20dd9cd5-8ce6-4f73-8380-dfa3074ce5a8
cluster‐name: DEFAULT
config:
server‐addr: 127.0.0.1:8848 # 配置中心地址
file‐extension: yaml
namespace: 20dd9cd5-8ce6-4f73-8380-dfa3074ce5a8 # 开发环境
group: NACOS_MICROSERVICE_GROUP # xx业务组
总结
我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。
Mybatis源码解析
[外链图片转存中…(img-I8BJcYJh-1715648132307)]
[外链图片转存中…(img-B5udUmut-1715648132307)]