标签:ati hot tis 选择 autowire 信息 tco show 库类
1) 什么是单体应用:
项目所有的资源都在一个应用中,打包成war包,使用一个tomcat去运行,运行在一个进程中
2) 单体应用的问题
a. 一个模块挂了,整个项目都受影响
b. 单个tomcat更能处理的并发有限,可以做集群,但是不方便局部(某一个模块)扩展
c. 维护/开发/升级比较麻烦
d. 代码臃肿,编译,打包都比较慢
e. 技术选择单一
f. 数据库选型单一
①编译难,部署难,测试难
②技术选择难
③扩展难
1) 什么是微服务架构
微服务就是把一个大的系统,拆分成多个晓得服务,每个微服务只专注一个业务,每个服务有各自的进程,微服务之间使用网络通信协议进行数据交互(通常是基于HTTP的RESTful风格)
2) 微服务的特点
a. 数据库选型多样化
b. 技术选型多样化
c. 每个微服务专注一个业务
d. 每个维护有自己的进程
e. 微服务之间通过网络协议进行通信
f. 方便做局部扩展
g. 开发/维护/升级更方便
单体应用架构:中小型项目(功能相对较少) crm 档案管理 库存管理,公司官网等
微服务架构:大型项目(功能比较多) 商城 erp,人力资源等
Spring cloud是一个基于Spring Boot实现的服务治理工具包,用于微服务架构中管理和协调服务的。
五大神兽:
服务注册发现——Netflix Eureka : 注册所有微服务的通信地址
客服端负载均衡——Netflix Ribbon\Feign :服务之间的调用问题
断路器——Netflix Hystrix :解决微服务故障问题,微服务的隔离
服务网关——Netflix Zuul :微服务的统一入口
分布式配置——Spring Cloud Config :统一管理微服务的配置文件
1) 导入依赖
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.SR1</spring-cloud.version> <springboot.version>2.0.5.RELEASE</springboot.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${springboot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
存放功能代码 domain,mapper,query...
1) 引入依赖
<!-- 引入公共依赖--> <dependency> <groupId>cn.dyier</groupId> <artifactId>product-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--springboot支持--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!-- mysql 数据库驱动. --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- springboot mybatis相关依赖--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version> </dependency>
2) application.yml配置
server:
port: 8001
spring:
application:
name: PRODUCT-SERVICE #服务名
#配置datasource
datasource:
url: jdbc:mysql:///test?useSSL=false
username: root
password: 123456
#mybatis包代理
mybatis:
type-aliases-package: cn.dyier.domain, cn.dyier.query
3) 入口类
@SpringBootApplication
@MapperScan("cn.dyier.mapper")
public class ProductService8001Application {
public static void main(String[] args) {
SpringApplication.run(ProductService8001Application.class, args);
}
}
4) Controller层代码(关键)
@RestController @RequestMapping("/product") public class ProductController { @Autowired private ProductService productService; /** * 根据id查询单条数据 * @param id * @return */ @GetMapping("/{id}") public Product findOne(@PathVariable(name = "id") Long id) { return productService.findOne(id); } }
1)导入依赖
<!-- 引入公共依赖--> <dependency> <groupId>cn.dyier</groupId> <artifactId>product-common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--springboot支持--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency>
2)配置yml
server:
port: 9001
spring:
application:
name: ORDER-SERVICE #服务名称
3)入口类和服务提供者相同
4)配置类 提供RestTemplate(为了调用远程接口)
@Configuration
public class BaseConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
5)contoller层(关键)
@RestController @RequestMapping("/order") public class OrderController { /** * 写死的前置地址 */ private final String URL_PREFIX = "http://localhost:8001/product/"; @Autowired private RestTemplate restTemplate; @GetMapping("/product/{id}") public Product findOne(@PathVariable(name = "id") Long id) { String url = URL_PREFIX + id; return restTemplate.getForObject(url, Product.class); } }
Eureka是netflix的一个子模块,也是核心模块之一,Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务发现和注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务,而不需要修改服务调用的配置文件了,功能类似于dubbo的注册中心,比如zookeeper。
1)导入依赖
<!--springboot支持--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!--Eureka服务端支持--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
2)yml配置
server:
port: 7001
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false #是否要注册到eureka
fetchRegistry: false #表示是否从Eureka Server获取注册信息
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #单机配置
3)主类
@SpringBootApplication @EnableEurekaServer //标识为eureka服务端 public class EurekaServer7001Application { public static void main(String[] args) { SpringApplication.run(EurekaServer7001Application.class, args); } }
4)启动
启动入库类访问localhost:7001
1)自我保护引发的错误
Eureka自我保护机制导致,不影响使用.
2)显示IP地址
问题:
解决方案: 在客户端yml配置
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka #告诉服务提供者要把服务注册到哪儿
instance:
prefer-ip-address: true #显示客户端真实ip
1)导入eureka依赖
<!--eureka客户端支持 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
2)yml配置
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka #告诉服务提供者要把服务注册到哪儿
instance:
prefer-ip-address: true # 当调用getHostname获取实例的hostname时,返回ip而不是host名称
ip-address: 127.0.0.1 # 指定自己的ip信息,不指定的话会自己寻找
3)启动类配置eureka客户端
加上@EnableEurekaClient注解
标签:ati hot tis 选择 autowire 信息 tco show 库类
原文地址:https://www.cnblogs.com/dyier/p/12292863.html