filter.NewDiscoveryNamespacesFilter(c.nsInformer.Lister(), options.MeshWatcher.Mesh().DiscoverySelectors)
// handle discovery namespace membership changes triggered by namespace events,
c.initDiscoveryHandlers(kubeClient, options.EndpointMode, options.MeshWatcher, c.discoveryNamespacesFilter)-->
	c.initDiscoveryNamespaceHandlers(kubeClient, endpointMode, discoveryNamespacesFilter)-->
		c.handleSelectedNamespace()-->
			// list each service/pod/ep/epslice in the namespace and process add event
			c.onServiceEvent(svc, model.EventAdd)
			c.pods.onEvent(pod, model.EventAdd)
			c.endpoints.onEvent(ep, model.EventAdd)
	// handle discovery namespace membership changes triggered by changes to meshConfig's discovery selectors
	c.initMeshWatcherHandler(kubeClient, endpointMode, meshWatcher, discoveryNamespacesFilter)
**registerHandlers(c.serviceInformer, c.queue, "Services", c.onServiceEvent, nil)-->**
	q.Push()
//============= onServiceEvent is handler for service event 
onServiceEvent()-->
	kube.ConvertService()// convert k8s service, persist lbAddr
	needsFullPush := extractGatewaysFromService()// extract gateway for LB type service which selector gateways, TODO: need to check performance impact when there are thousands of gw services
		extractGatewaysInner()-->
			getGatewayDetails()// get cross network port(networking.istio.io/gatewayPort 15443) and network(topology.istio.io/network), return empty result when network is not specified
			if gwPort == 0 || network == "" {return false} // important, if has such settings, service change will trigger fullPush
			if gwPort changed or network changed {return true}
	if needsFullPush {
		c.xdsUpdater.ConfigUpdate(&model.PushRequest{Full: true, Reason: []model.TriggerReason{model.NetworksTrigger}})
	}
	c.endpoints.buildIstioEndpointsWithService(svc.Name, svc.Namespace, svcConv.Hostname)-->
		buildIstioEndpoints()--》
			NewEndpointBuilder(e.c, pod)
			builder.buildIstioEndpoint(ea.IP, port.Port, port.Name)
	c.xdsUpdater.EDSCacheUpdate(c.clusterID, string(svcConv.Hostname), svc.Namespace, endpoints)
	c.xdsUpdater.SvcUpdate(c.clusterID, string(svcConv.Hostname), svc.Namespace, event)
	// Notify service handlers.
	for _, f := range c.serviceHandlers {
		f(svcConv, event)// m.XDSUpdater.ConfigUpdate(req)
	}
//==============
newEndpointsController()-->
	**registerHandlers(informer, c.queue, "Endpoints", out.onEvent, endpointsEqual)**
	//================out.onEvent()
	  // processEndpointEvent triggers the config update.
		processEndpointEvent()-->
			updateEDS(c, epc, ep, event)-->
				c.xdsUpdater.EDSUpdate(c.clusterID, string(host), ns, endpoints)
	//================
newEndpointSliceController()
**registerHandlers(c.nodeInformer, c.queue, "Nodes", c.onNodeEvent, nil)**
//================c.onNodeEvent()
  // no nodePort gateway service found, no update
//================
**registerHandlers(c.pods.informer, c.queue, "Pods", c.pods.onEvent, nil)**
//================c.pods.onEvent()
  // add to cache if the pod is running or pending
	pc.update(ip, key)
	// find all related services and update CDS
	// handler is registerred in pilot/pkg/serviceregistry/kube/controller/controller.go:WorkloadInstanceHandler
	WorkloadInstanceHandler()
//================