Maven的依赖冲突解决方案:
SpringBoot场景启动器starter的开发流程
c3p0-spring-boot-starter自定义场景启动器
test-c3p0调用自定义场景启动器
微服务
将应用划分为若干个体量更小的服务,每个服务可以独立开发、独立部署、独立运行,服务之间可以通过轻量级通信机制进行相互调用
用户管理系统
用户微服务
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
)
针对不同的服务当作一个独立的应用进行开发
下面来写Controller里的具体实现
@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);
....
}
}
方法1:使用绝对路径,例如http://localhost:7081/roles/1。问题是role服务的地址可能会出现调整,或者role服务由于频繁访问需要多节点部署
针对方法1的缺陷引入中间件nacos作为注册中心。
当所有的服务提供者,例如role服务,启动时都会自动向nacos注册自己的信息,例如服务的名称,自己的地址和自己对外提供服务的端口号等
当服务消费者需要调用服务时,可以向nacos查询对应服务名称的提供者地址列表,例如通过role-service服务名获取到所有的role服务的地址列表
1、添加依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
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、依赖
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery2、配置
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 {
@Autowired
private RestTemplate restTemplate;
@Autowired
private 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+"]";
}
}