- 1.单体应用架构和微服务的架构优缺点
单体应用架构:所有的jar包,在整合成打成一个war 部署tomcat运行
缺点:
如果多写一个功能,在部署,编译 测试上面变得更加 难
技术选型上面不是很灵活
扩展避免麻烦 浪费很多空间
微服务架构: 把以前整个服务进行拆分成微小的服务;每个服务独立运行 独立部署 ,独立维护 --分布式
好处:
部署,编译,测试 更加简单
技术比较灵活 --每个服务都可以使用不一样技术
扩展比较方便 --如果哪个服务负载比较大,就可以针对那个服务去扩展
- 实现微服务的架构 技术
服务治理的框架
Springboot+springCloud
Dubbo
Dubbox
SpringcloudAlibaba
- SpringCloud使用
① 服务注册中心 Eureka /Consule/Zookeeper 7001
导入jar 配置 启动
② 服务提供者 provider 8001
③ 服务消费者 consumer 9001
服务要注册到注册中心,然后消费者来消费服务
步骤:
启动注册中心 7001开头
server:
port: 7001
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false #是否要注册到eureka
fetchRegistry: false #表示是否从Eureka Server获取注册信息
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机配
启动类
@SpringBootApplication
@EnableEurekaServer//标识是eureka服务端
public class EnrekaServerApplication_7001 {
public static void main(String[] args) {
SpringApplication.run(EnrekaServerApplication_7001.class);
}
}
服务提供者 8001开头
消费者 9001开头
注册中心集群
(1) 修改hosts 地址
127.0.0.1 eureka-7001.com
127.0.0.1 eureka-7002.com
(2) 7001注册配置
server:
port: 7001
eureka:
instance:
hostname: eureka-7001.com
client:
registerWithEureka: false #是否要注册到eureka
fetchRegistry: false #表示是否从Eureka Server获取注册信息
serviceUrl:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机配置
defaultZone: http://eureka-7002.com:7002/eureka/ #集群配置,如果有多个,有逗号分割,不要包含自己
server:
port: 7002
eureka:
instance:
hostname: eureka-7002.com
client:
registerWithEureka: false #是否要注册到eureka
fetchRegistry: false #表示是否从Eureka Server获取注册信息
serviceUrl:
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机配置
defaultZone: http://eureka-7001.com:7001/eureka/ #集群配置,如果有多个,有逗号分割,不要包含自己
(2) 把服务提供者注册到注册中心 7001和7002里面
server:
port: 8001
spring:
application:
name: user-provider #不要使用下划线
eureka:
client:
service-url:
#defaultZone: http://localhost:7001/eureka #告诉服务提供者要把服务注册到哪儿
defaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka
instance:
prefer-ip-address: true #显示客户端真实ip
(3) 消费 实现负载均衡
如有要实现负载均衡 在提供一个服务 8002
Ribbon
@Configuration
public class CfgBean {
@Bean
@LoadBalanced //开启负载均衡
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
-----------------------------------------------------------------------------------
@RestController
@RequestMapping("/consumer")
public class UserController {
//多个方法调用只需改一处就ok
//public static final String URL_PREFIX = "http://localhost:8001";
public static final String URL_PREFIX ="http://USER-PROVIDER"; //通过服务名从注册中心获取服务列表,通过负载均衡调用
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/user/{id}")
public User getUser(@PathVariable("id")Long id){
//调用远程服务 http请求
String url = URL_PREFIX+"/provider/user/"+id;
return restTemplate.getForObject(url,User.class );
}
}
Fegin
通过一个接口方式来实现 --推荐方式 暴露接口
Ribbon resttemplate方式来访问 – 传递参数比较麻烦
(1) 写一个接口
//调用服务名字
@FeignClient(value = "USER-PROVIDER")
@RequestMapping("/provider")
public interface UserCilent {
@RequestMapping("/user/{id}") //user/1
User getUser(@PathVariable("id") Long id);
}
(2) 消费端 9002 fegin调用
@RestController
@RequestMapping("/consumer")
public class UserController {
@Autowired
private UserCilent userCilent;
@RequestMapping("/user/{id}")
public User getUser(@PathVariable("id")Long id){
System.out.println(userCilent.getClass());
return userCilent.getUser(id);
}
}