# hao-cloud **Repository Path**: iuhao2016/hao-cloud ## Basic Information - **Project Name**: hao-cloud - **Description**: 整合springcloud - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-07-11 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 微服务开发 * config 配置中心,默认从本地获取。 * registry 注册中心。eureka.instance配置(见EurekaInstanceConfigBean) * user-service 用户中心的服务提供者和消费者,其中client包中存放调用别的微服务接口(定义一个Interface接口并添加@FeignClient注解,并指定服务提供者的服务名、添加需要访问的rest请求。在主类上添加@EnableFeignClients,如果该服务需要作为提供者还需加上@EnableEurekaClient)。 * user-service-facade 用户中心的共享服务接口,供提供者和消费者来继承其特性。 * monitor 服务监控。turbine 集群监控,app-config:需要收集监控的服务名;cluster-name-expression:指定集群名,当服务非常多时可以开启多个turbine 服务来构建不同的聚合集群。combine-host-port:设置为true,让同一台主机上的服务通主机名与端口组合来区分。 * zuul 网关。zuul.ignored-services: '*'的作用是不自动创建路由规则。个人认为不加的必须带上routes的路由名如http://localhost:5555/order-service/order/***的样子,加上后变为http://localhost:5555/order/***.跟直接请求服务地址一样。路由配置:zuul.routes.=, 当stripPrefix=true的时候 (http://127.0.0.1:8181/api/user/list -> http://192.168.1.100:8080/user/list) 当stripPrefix=false的时候(http://127.0.0.1:8181/api/user/list -> http://192.168.1.100:8080/api/user/list) * zipkin 服务日志收集服务中心。zipkin配置有两种方式:一种是URL(spring.zipkin.base-url)另一种是MQ,日志抽样收集配置默认0.1见:PercentageBasedSampler。可以在调用方设置:spring.sleuth.sampler.percentage=1 # 使用Feign时注意点,请求类型最好都是post类型(特别是传输参数是大对象),自动会把get类型转成post类型,在资源提供者函数中必须添加@RequestBoy注解,不然请求不到资源。 ## 添加监控时必须在服务端引入,spring-cloud-starter-hystrix、spring-boot-starter-actuator(不引入时报错:Unable to connect to Command Metric Stream),在监控端引入;spring-cloud-starter-hystrix-dashboard、spring-cloud-starter-hystrix * 在单机模式下:Hystrix Dashboard页面上输入需要监控的服务端地址如:http://localhost:8001/hystrix.stream ## 使用声明式服务调用feign集成了(Ribbon+Hystrix) * 要开启Hystrix服务降级处理,必须在配置中设置feign.hystrix.enabled=true,默认是false,具体见FeignClientsConfiguration类。如果设置为false,就要设置服务列表如:<服务名>.rabbion.listOfServers=http://localhost:8000 * @FeignClient的fallback就是要对服务进行降级处理具体Bean。 * 设置服务的负载均衡策略格式:<服务名>.rabbion.key=value如user-service.rabbion.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RetryRule。具体的key值见CommonClientConfigKey类。rabbion负载均衡器包含:RetryRule(重试)、RandomRule、RoundRobinRule、ZoneAvoidancePredicate(默认设置)等。 ## 使用spring boot admin 监控系统 ## 如何读取自定义配置文件 * ClassLoader loader = Thread.currentThread().getContextClassLoader()具体见ConfigurationManager.loadPropertiesFromResources ## LogstashTcpSocketAppender 传输到Logstash服务器,添加,在Logstash的安装目录的config下新建***.conf文件,内容: input { tcp { port => 4560 codec => json_lines } } output{ elasticsearch { hosts => ["localhost:9200"] index => "logstash-%{+YYYY.MM.dd}" } stdout { codec => rubydebug } } * 127.0.0.1:4560 * 1048576 * 16384 * 5 minutes ## 使用docker-compose启动服务(默认读取:docker-compose.yml),文件中build和image只能有一个。 * docker-compose -f docker-compose.dev.yml up --build ## 使用docker-maven-plugin插件远程插件image * 在指定需要创建镜像的module下的pom文件中添加: com.spotify docker-maven-plugin 1.0.0 ${project.name}:${project.version} ${project.basedir} false ${project.build.directory} ${project.build.finalName}.jar * 在远程docker主机开启API,修改docker配置文件: * vi /usr/lib/systemd/system/docker.service * 将ExecStart这一行后面加上 -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock,修改完:ExecStart=/usr/bin/dockerd-current -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock \ * systemctl daemon-reload * 启动docker systemctl start docker,docker主机的配置完成。 * 在客户端配置环境变量:export DOCKER_HOST=tcp://docker主机的ip:2375 * 在指定模块下执行:mvn -DskipTests=true clean package docker:build * 当在执行中出现:Thin Pool has 1063 free data blocks which is less than minimum required 1252 free data blocks.报错信息时,需执行。 * docker rm $(docker ps -q -f status=exited) * docker volume rm $(docker volume ls -qf dangling=true) ## 跨域问题解决方式 * 在网关入口添加CorsFilter过滤器 * 在对资源进行权限判断时如果请求方法为OPTIONS的直接放行。 * 跨域对同一个URL会发送两次请求,第一次的请求方法为OPTIONS,第二次才是真正的业务请求。 * 请求通过之后就不会发送两次请求了,具体是因为在 CorsConfiguration 中设置缓存过期时间 corsConfiguration.setMaxAge(Long.MAX_VALUE); ## 开发注意事项 * 系统已经对公共字段进行处理,需要在实体中添加FieldFill。 * 工具类使用hutool。 * Controller层禁止使用对应数据库表实体,推荐使用:VO。 * Service层参数禁止使用VO,超过四个参数需要包装,推荐使用:DTO。 * 在entity包中对应数据库表实体信息,禁止在其中添加与数据库表字段无关的字段,如果有多表连查时自定义DTO。 * vo包中存放的前后端之间交互的实体。 * dto包中存放的业务层之间交互用的实体。 * 由于数据库表ID生成策略使用Snowflake,故表ID使用bigint类型。 * 由于js对Long类型会丢失精度问题,故需要序列化和反序列化。 * 使用lombak工具来生成getter、setter和进行日志 * Service层方法命名规则,如果获取单条信息使用get开头、多条find开头,携带额外信息必须带有With例子:获取带有角色、部门信息的用户 getUserWithRoleDeptById