2、application.yml配置Nacos服务中心地址com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
spring:
application:
name: product
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
3、通过@NacosInjected注入Nacos地NamingService
4、使用Nacos提供的OpenAPI方法
(1)注册实例
- registerInstance(serviceName, ip, port)
- registerInstance(serviceName, ip, port, clusterName)
- registerInstance(serviceName, instance)
(2)获取实例
- getAllInstances(serviceName)
- getAllInstances(serviceName, clusters)
(3)监听服务
- subscribe(serviceName, listener)
- subscribe(serviceName, clusters, listener)
【Dubbo】
5、Dubbo使用Nacos实现注册中心 (1)application.propertiesdubbo.application.name: spring-boot-dubbo-nacos-sample dubbo.registry.address=nacos://127.0.0.1:8848 dubbo.protocol.name=dubbo dubbo.protocol.port=20880(2)通过Dubbo的@Service声明 (3)启动类使用@DubboComponentScan扫描@Service 二、Nacos配置中心 1、pom.xml配置依赖
2、bootstrap.properties配置Nacos配置中心地址com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.namespace=6ca49aac-50ec-4e6f-8686-70bb11922fdd3、使用注解从NacosServer动态读取配置
@NacosPropertySource(dataId = "example", autoRefreshed = true)
@RestController
public class NacosConfigController{
@NacosValue(value = "${info:Local Hello World}", autoRefreshed = true)
private String info;
@GetMapping("/config")
public String get(){
return info;
}
}
(1)@NacosPropertySource:用于加载dataId为example地配置源,autoRefreshed表示开启自动更新;
(2)@NacosValue:设置属性的默认值
4、使用Nacos提供的OpenAPI方法 三、Dubbo【服务提供者】
1、pom.xml配置依赖2、application.properties配置Dubbo服务com.springframework.boot spring-boot-starterorg.apache.dubbo dubbo-spring-boot-starter2.7.5
spring.application.name=spring-dubbo-demo dubbo.application.name=springboot-provider dubbo.protocol.name=dubbo dubbo.protocol.port=20880 dubbo.registry.address=N/A3、声明Dubbo提供的@Service注解发布服务
@Service
public class HelloServiceImpl implements HelloService{
@value("${dubbo.application.name}")
private String servicename;
@Override
public String sayHello(String name){
return servicename;
}
}
4、启动方法上添加@DubboComponentScan,用来扫描Dubbo声明的@Service
@DubboComponentScan
@SpringBootApplication
public class ProviderApplication{
public static void main(Sting[] args){
SpringApplication.run(ProviderApplication.class, args);
}
}
【服务调用者】
1、pom.xml配置依赖2、application.properties配置Dubbo服务org.apache.dubbo dubbo-spring-boot-starter2.7.5
dubbo.application.name=springboot-consumer3、使用Dubbo提供的@Reference注解获取远程代理服务对象
@Reference(url = "dubbo://192.168.13.1:20880/com.gupaoedu.book.dubbo.helloService") private HelloService helloService;
【高级配置】
1、集群容错@Service(cluster = "failfast")容错模式
(1)Failover Cluster:失败自动切换。调用失败后,切换到集群中其他机器,默认重试两次。
(2)Failfast Cluster:快速失败。调用失败后,立即报错,只发起依次调用。
(3)Failsafe Cluster:失败安全。出现异常时,直接忽略。
(4)Failback Cluster:失败后自动回复。后台记录失败请求,定时重发。
(5)Forking Cluster:并行调用集群中的多个服务,只要其中一个成功就返回。
(6)Broadcast Cluster:广播调用所有的服务提供者,任意一个服务报错则表示服务调用失败。
2、负载均衡@Service(cluster = "failfast", loadbalance = "roundrobin")负载均衡策略
(1)Random LoadBalance:随机算法。可能针对性能较好的服务器设置较大的权重值。
(2)RoundRobin LoadBalance:轮询。按照公约后的权重设置轮询比例。
(3)LeastActive LoadBalance:最少活跃调用书。处理较慢的节点将会收到更少的请求。
(4)ConsistentHash LoadBalance:一致性Hash。相同参数的请求总是发送到同一个服务提供者。
3、服务降级 (1)创建降级本地数据默认返回public class MockHelloService implements HelloService{
@Override
public String sayHello(String s){
return "Sorry, 服务无法访问, 返回降级数据";
}
}
(2)@Reference注解增加Mock参数
@Reference(mock = "com.gupaoedu.book.springcloud.springclouddubboconsumer.MockHelloService", cluster = "failfast") private HelloService helloService;4、主机绑定 (1)Dubbo服务对外发布的IP地址,默认顺序
- 查找环境变量中的DUBBO_IP_TO_BIND属性配置的IP地址
- 查找dubbo.protocol.host属性配置的IP地址,默认是空
- 通过LocalHost.getHostAddress获取本机IP地址
- 注册中心的地址,使用Socket通信连接到注册中心的地址后,使用for循环通过socket.getLocalAddress().getHostAddress()扫描各个网卡获取网卡IP地址
- /etc/hosts中配置机器名对应正确的IP地址映射
- 环境变量添加DUBBO_IP_TO_BIND或者DUBBO_IP_TO_REGISTRY属性
- 通过dubbo.protocol.host设置主机地址
四、Feign 1、pom.xml引入依赖无法正常调用原因:Dubbo通过获取本机的hostname映射IP地址,如果IP地址错误,依然会注册ZooKeeper,并且正常启动。
2、定义接口,通过@FeignClient注解指定服务名来绑定服务org.springframework.cloud spring-cloud-starter-openfeign
声明接口的每一个方法都是调用哪个远程服务的哪个请求
@FeignClient("whalemall-coupon")
public interface CouponFeignService {
@PostMapping("/coupon/spubounds/save")
R saveSpuBounds(@RequestBody SpuBoundTo spuBoundTo);
@PostMapping("/coupon/skufullreduction/saveinfo")
R saveSkuReduction(@RequestBody SkuReductionTo skuReductionTo);
}
3、启动类通过@EnableFeignClients注解开启Spring Cloud Feign
@EnableFeignClients(basePackages = "com.island.whalemall.product.feign")
@EnableDiscoveryClient
@MapperScan("com.island.whalemall.product.dao")
@SpringBootApplication
public class WhalemallProductApplication {
public static void main(String[] args) {
SpringApplication.run(WhalemallProductApplication.class, args);
}
}
五、Gateway
1、pom.xml添加依赖
2、application.yml文件中添加Gateway的路由配置org.springframework.cloud spring-cloud-starter-gateway
spring:
cloud:
gateway:
routes:
# 商品服务
- id: product_route
uri: lb://whalemall-product
predicates:
- Path=/api/product
@Value("${elasticsearch.ip}")
String ipPort;
@Bean
public RestClientBuilder restClientBuilder() {
return RestClient.builder(makeHttpHost(ipPort));
}
@Bean(name = "highLevelClient")
public RestHighLevelClient highLevelClient(@Autowired RestClientBuilder restClientBuilder) {
restClientBuilder.setMaxRetryTimeoutMillis(60000);
return new RestHighLevelClient(restClientBuilder);
}
private HttpHost makeHttpHost(String s) {
String[] address = s.split(":");
String ip = address[0];
int port = Integer.parseInt(address[1]);
return new HttpHost(ip, port, "http");
}
}
4、添加
localhost:9200/customer/_doc/1?pretty
{
"city": "北京",
"useragent": "Mobile Safari",
"sys_version": "Linux armv8l",
"province": "北京",
"event_id": "",
"log_time": 1559191912,
"session": "343730"
}
5、条件查询
@Service
public class TestService {
@Autowired
RestHighLevelClient highLevelClient;
private void search(RestHighLevelClient highLevelClient) throws IOException {
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices("customer");
searchRequest.types("_doc");
// 条件=
MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("city", "北京");
TermQueryBuilder termQuery = QueryBuilders.termQuery("province", "福建");
// 范围查询
RangeQueryBuilder timeFilter = QueryBuilders.rangeQuery("log_time").gt(12345).lt(343750);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
QueryBuilder totalFilter = QueryBuilders.boolQuery()
.filter(matchQuery)
.filter(timeFilter)
.mustNot(termQuery);
int size = 200;
int from = 0;
long total = 0;
do {
try {
sourceBuilder.query(totalFilter).from(from).size(size);
sourceBuilder.timeout(new Timevalue(60, TimeUnit.SECONDS));
searchRequest.source(sourceBuilder);
SearchResponse response = highLevelClient.search(searchRequest);
SearchHit[] hits = response.getHits().getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
total = response.getHits().totalHits;
System.out.println("测试:[" + total + "][" + from + "-" + (from + hits.length) + ")");
from += hits.length;
// from + size must be less than or equal to: [10000]
if (from >= 10000) {
System.out.println("测试:超过10000条直接中断");
break;
}
} catch (Exception e) {
e.printStackTrace();
}
} while (from < total);
}
}
十一、MySQL 1、pom.xml引入MySQL依赖
2、application.propertiesmysql mysql-connector-javaorg.springframework.boot spring-boot-starter-jdbcorg.apache.commons commons-dbcp2
spring.datasource.url=jdbc:mysql://localhost:3306/spring_boot_chapter5 spring.datasource.username=root spring.datasource.password=123456 # 即使注释掉了驱动,SpringBoot会尽可能判断数据源,然后默认匹配 # spring.datasource.driver-class-name=com.mysql.jdbc.Driver # 指定数据库连接池类型 spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource # 最大等待连接中的数量,设 0 为没有限制 spring.datasource.dbcp2.max-idle=10 # 最大连接活动数 spring.datasource.dbcp2.max-total=50 # 最大等待毫秒数,单位ms spring.datasource.dbcp2.max-wait-millis=10000 # 数据库连接池初始化连接数 spring.datasource.dbcp2.initial-size=53、使用MyBatis框架 (1)pom.xml引入依赖
(2)application.propertiesorg.mybatis.spring.boot mybatis-spring-boot-starter1.3.1
# MyBatis映射文件通配 mybatis.mapper-locations=classpath:com/springboot/chapter/mapper/*.xml # Mybatis扫描别名包,和注解@Alias联用 mybatis.type-aliases-package=com.springboot.chapter.pojo # 配置typeHandler的扫描包 mybatis.type-handlers-package=com.springboot.chapter.typehandler
可配置属性
- properties :属性
- settings:设置
- typeAliases:类型别名
- typeHandlers:类型处理器
- objectFactory:对象工厂
- plugins:插件
- environments:数据库环境
- databaseIdProvider:数据库厂商标识
- mappers:映射器
2、application.propertiesredis.clients jedisorg.springframework.boot spring-boot-starter-redisio.lettuce lettuce-core
# 配置连接池属性 spring.redis.jedis.pool.min-idle=5 spring.redis.jedis.pool.max-idle=10 spring.redis.jedis.pool.max-active=10 spring.redis.jedis.pool.max-wait=2000 # 配置Redis服务器属性 spring.redis.port=6379 spring.redis.host=192.168.11.131 spring.redis.password=123456 # Redis连接超时时间,单位ms spring.redis.timeout=10003、使用springboot提供的StringRedisTemplate来操作redis(是对jedis的再次封装)
ValueOperations十三、MongoDBops = stringRedisTemplate.opsForValue(); //保存 ops.set("hello", "world_" + UUID.randomUUID().toString()); //查询 String hello = ops.get("hello");



